여러 디렉터리가 있는지 확인

여러 디렉터리가 있는지 확인

dir1작업 디렉터리에 , , 등 여러 디렉터리가 존재하는지 확인하고 싶습니다 dir2.dir3

나는 다음을 가지고 있습니다

if [ -d "$PWD/dir1" ] && [ -d "$PWD/dir2" ] && [ -d "$PWD/dir3" ]; then
    echo True
else
    echo False
fi

하지만 더 우아한 방법이 있다고 생각합니다. 디렉터리 이름에 패턴이 있다고 가정하지 마세요.

목표는 일부 디렉터리가 존재하는지, 다른 디렉터리는 존재하지 않는지 확인하는 것입니다.

Bash를 사용하고 있지만 이식 가능한 코드가 선호됩니다.

답변1

나는 반복할 것이다:

result=True
for dir in \
        "$PWD/dir1" \
        "$PWD/dir2" \
        "$PWD/dir3" 
do
    if ! [ -d "$dir" ]; then
        result=False
        break
    fi
done
echo "$result"

이로 break인해 체인과 마찬가지로 루프가 단락될 수 있습니다.&&

답변2

이미 디렉터리일 것으로 예상하고 모두 존재하는지 확인하는 경우 ls유틸리티의 종료 코드를 사용하여 하나 이상의 디렉터리가 있는지 확인할 수 있습니다."에러 발생됨":

ls "$PWD/dir1" "$PWD/dir2" "$PWD/dir3" >/dev/null 2>&1 && echo All there

출력이 아닌 종료 코드에만 관심이 있기 때문에 출력과 stderr을 /dev/null사라지도록 리디렉션했습니다. ls작성된 내용은 모두 /dev/null사라지며 터미널에 기록되지 않습니다.

답변3

루프가 더 우아할 수 있습니다.

arr=("$PWD/dir1" "$PWD/dir2" "$PWD/dir2")
for d in "${arr[@]}"; do
    if [ -d "$d"]; then
        echo True
    else
        echo False
    fi
done

배쉬입니다. 더 휴대성이 뛰어난 것은 Sh입니다. 거기에서 위치 배열을 사용할 수 있습니다.

set -- "$PWD/dir1" "$PWD/dir2" "$PWD/dir2"

그런 다음 순환합니다 "$@".

답변4

질문에 따르면 여러 디렉터리의 존재를 테스트하는 두 가지 휴대용 셸 함수가 있습니다.

# Returns success if all given arguments exists and are directories.
ck_dir_exists () {
    for dir do
        [ -d "$dir" ] || return 1
    done
}

# Returns success if none of the given arguments are existing directories.
ck_dir_notexists () {
    for dir do
        [ ! -d "$dir" ] || return 1
    done
}

예:

$ mkdir dir1 dir2
$ ck_dir_exists dir1 dir2; echo $?
0
$ ck_dir_exists dir1 dir2 dir3; echo $?
1
$ ck_dir_notexists dir1 dir2 dir3; echo $?
1
$ ck_dir_notexists dir3 dir4; echo $?
0

관련 정보