2015-02-06 2 views
0

두 개의 인수를 디렉토리 이름으로 사용하고 디렉토리 1에 디렉토리 2가 포함되어 있는지 또는 디렉토리 2에 디렉토리 2가 포함되어 있는지 확인하는 스크립트 쉘을 작성하려고합니다. 그리고 그들 사이에 관계가 없다면 또한.Linux에서 디렉토리 검사

디렉토리가 존재하는지 확인하는 명령은 find -type d입니다. 그러나 이름을 확인하고 구문 분석하는 방법으로 약간 혼란 스럽습니다. if-else 루프가 필요할 것입니다. 조건을 확인하는 방법을 모르십니까?

+2

디렉토리가 존재하는지 확인하는 것은'[[-d dirname]]'일 것입니다. 당신이 쓴 ('find -type d') 것은 * "directory"타입의 모든 아이템을 찾는다. * 당신은 여전히 ​​결과를 확인해야한다. – DevSolar

+0

하나의 디렉토리에 다른 디렉토리가 있는지 어떻게 확인합니까? – chillax786

+0

이름 만 파싱하는 것을 고려하고 있습니까, 아니면 심볼릭 링크를 고려하고 싶습니까? 부분 경로에 기호 링크가 있으면 어렵습니다. (여전히 가능해야합니다.) –

답변

1

이 내가 생각하는 트릭을 할 것입니다,

find -name directory1 |grep directory2 

또는 그 반대로, 그것은 실패에 대한 성공을위한 01을 줄 것이다

echo $? 

사용합니다.

+1

나는이 대답을 좋아합니다. 그것은 @ DevSolar의 코멘트와 함께 작동합니다. –

+0

감사합니다. @purplehuman – Skynet

3

find은 필요하지 않습니다. 이와 유사한 뭔가 (하지만 공백이나 일부 특수 문자와 디렉토리 이름을 보장하지.) :

if [ "$dir1" == "$dir2" ]; then 
    echo "$dir1 == $dir2"; 
    exit; 
fi 
if grep -E -q "^$dir2" <<< $dir1; then 
    echo "$dir1 is contained by $dir2." 
    exit 
fi 
if grep -E -q "^$dir1" <<< $dir2; then 
    echo "$dir2 is contained by $dir1."; 
fi 

그러나,이 기호 링크를 처리하지 않습니다. 예를 들어, sym1 -> /usr/local/binsym2 -> /usr/local, 분명히 sym2sym1을 포함합니다.

또한,이 /usr/bin

--- 업데이트 --- DevSolar과 동일 /usr/local/bin, 또는 /usr/local/../bin,과 동일 /usr/local/./bin처럼, 이상한 찾고 디렉토리 이름을 처리하지 않습니다 심볼릭 링크를 해결하기 위해 readlink -e을 사용할 수 있습니다. 내 테스트에서는 이상한 디렉토리 이름을 ... 같은 이름으로 해결합니다. DevSolar 덕분에.

+0

이와 같이'grep'을 사용하지 마십시오. 대신'if '에 대한 인수로'-q' 스위치와 함께'grep'을 사용하십시오 : if grep -E -q "^ $ dir1"<<< "$ dir2"; 그때'. 디렉토리 이름에 정규 표현식으로 해석 될 특수 문자 (예 :'.','?','(', 등)가 포함되어 있으면 전체 메소드에 결함이 있습니다. 외부 도구없이 하위 문자열을 검사하는 더 좋은 방법 :'[[$ dir1 = "$ dir2"*]]; then'은 훨씬 더 좋습니다 –

+0

'grep'의'-q' 옵션을 알면 좋습니다. 'grep'을 잘 알고, 나는 그것을 보통 사용합니다.나는 방금 다른 사람의'$? '대답으로 고정 관념에 빠져 있었다. :-) 나는 지금 대답을 편집 할 것이다. –

+0

@gniourf_gnirourf if [[$ dir1 = "$ dir2"*]]'에 관해서는 더 나은 대답이라고 생각합니다. 새로운 대답으로 게시해야합니다. 나는 내 것을 바꾸지 않을 것이다. –

2

원하십니까?


if [ -d $1 ];then 
    a=`find $1 -type d -name $2` 
    if [ $a ];then 
     echo "$1 has $2" 
    else 
     echo "$1 does NOT has $2" 
    fi 
fi 

if [ -d $2 ];then 
    b=`find $2 -type d -name $1` 
    if [ $b ];then 
     echo "$2 has $1" 
    else 
     echo "$2 does NOT has $1" 
    fi 
fi 
관련 문제