답변:
쉘 스크립트에 디렉토리가 있는지 확인하려면 다음을 사용할 수 있습니다.
if [ -d "$DIRECTORY" ]; then
# Control will enter here if $DIRECTORY exists.
fi
또는 디렉토리가 존재하지 않는지 확인하려면 다음을 수행하십시오.
if [ ! -d "$DIRECTORY" ]; then
# Control will enter here if $DIRECTORY doesn't exist.
fi
그러나 Jon Ericson이 지적했듯이 디렉토리에 대한 심볼릭 링크도이 검사를 통과하지 않으면 후속 명령이 의도 한대로 작동하지 않을 수 있습니다. 예를 들어 이것을 실행 :
ln -s "$ACTUAL_DIR" "$SYMLINK"
if [ -d "$SYMLINK" ]; then
rmdir "$SYMLINK"
fi
오류 메시지가 나타납니다.
rmdir: failed to remove `symlink': Not a directory
따라서 후속 명령에서 디렉토리가 필요한 경우 기호 링크를 다르게 처리해야 할 수 있습니다.
if [ -d "$LINK_OR_DIR" ]; then
if [ -L "$LINK_OR_DIR" ]; then
# It is a symlink!
# Symbolic link specific commands go here.
rm "$LINK_OR_DIR"
else
# It's a directory!
# Directory command goes here.
rmdir "$LINK_OR_DIR"
fi
fi
변수를 감싸는 데 사용되는 큰 따옴표를 특히주의하십시오. 이것에 대한 이유 는 다른 답변에서 8jean 에 의해 설명됩니다 .
변수에 공백이나 다른 특수 문자가 포함되어 있으면 스크립트가 실패 할 수 있습니다.
[ ! -d "$DIRECTORY" ]하나 경우에 true가됩니다 $DIRECTORY존재하지 않는 경우, 또는 않는 존재를하지만, 디렉토리가 아니다. 다음과 같은 것을 고려하십시오 if [ ! -d "$DIRECTORY" ] ; then mkdir "$DIRECTORY" ; fi. "$DIRECTORY"파일 인 경우 실패 합니다. (물론 mkdir어쨌든 성공 했는지 확인해야 합니다. 실패 할 수있는 여러 가지 이유가 있습니다.)
-d)와 심볼릭 링크 ( -L) 를 모두 테스트하는 대신 변수에 슬래시를 추가하는 것이 더 쉽습니다 (예 :) if [ -d "${THING:+$THING/}" ]. 디렉토리는 추가 슬래시를 신경 쓰지 않습니다. 파일은 거짓으로 평가됩니다. 공란은 공란으로 유지되므로 거짓입니다. 그리고 심볼릭 링크는 목적지로 결정됩니다. 물론 그것은 당신의 목표에 달려 있습니다. 거기 에 가고 싶다면 괜찮습니다. 당신이 할 경우 삭제 , 다음이 답변의 코드가 더 좋다.
Bash 스크립트에서 변수를 참조 할 때는 항상 큰 따옴표로 묶어야합니다. 요즘 아이들은 디렉토리 이름에 공백과 다른 많은 재미있는 캐릭터를 가질 수 있다는 생각으로 자랍니다. (공백! 나의 시대에, 우리는 공상 공간이 없었습니다!;))
어느 날, 그 아이들 중 한 명이로 $DIRECTORY설정된 상태에서 스크립트를 실행 "My M0viez"하면 스크립트가 폭발합니다. 당신은 그것을 원하지 않습니다. 이것을 사용하십시오.
if [ -d "$DIRECTORY" ]; then
# Will enter here if $DIRECTORY exists, even if it contains spaces
fi
메모 -d 몇 가지 놀라운 결과를 생성 할 수 있습니다 테스트를 :
$ ln -s tmp/ t
$ if [ -d t ]; then rmdir t; fi
rmdir: directory "t": Path component not a directory
"디렉토리가 디렉토리가 아닌 경우"아래의 파일 대답 : "디렉토리에 대한 심볼릭 링크 인 경우" 약간 더 철저한 테스트 :
if [ -d t ]; then
if [ -L t ]; then
rm t
else
rmdir t
fi
fi
Bash 매뉴얼에서 Bash 조건식 과 [내장 명령 및 [[복합 명령 에 대한 자세한 정보를 찾을 수 있습니다 .
if [ -d tmpdir -a ! -L tmpdir ]; then echo "is directory"; rmdir tmpdir; fi... 또는 링크와 디렉토리 모두에서 작동하는 하나의 명령에 대해 다음과 같습니다.rm -r tmpdir
나는 찾을 이중 브라켓 버전 test로직 테스트를 더 자연스럽게 쓰는 브랜드를 :
if [[ -d "${DIRECTORY}" && ! -L "${DIRECTORY}" ]] ; then
echo "It's a bona-fide directory"
fi
if [[ -d "$TARFILE" ]][[: 찾을 수 없음
[[ ]]이 지원되지만 실제로 다른 기능을 제공하지는 않습니다 [ ]. 이식성이 문제가되는 경우 [ ]필요한 해결 방법을 사용하십시오.
더 짧은 형태 :
[ -d "$DIR" ] && echo "Yes"
if $dir is a dir, then echo "yes"? 약간의 설명이 도움이 될 것입니다 :)
set -e( 쉘 프로그래밍 모범 사례 ).
[ -d "$DIR" ]가 확인되고 (뒤에 && echo Yes) set -e스크립트 동작에 아무런 영향을 미치지 않는다고 생각 합니다 (예 : 테스트가 실패하면 스크립트가 정상적으로 계속됩니다).
디렉토리가 존재하는지 확인하려면 if다음과 같은 간단한 구조를 사용할 수 있습니다 .
if [ -d directory/path to a directory ] ; then
# Things to do
else #if needed #also: elif [new condition]
# Things to do
fi
당신은 또한 부정적인 것으로 할 수 있습니다 :
if [ ! -d directory/path to a directory ] ; then
# Things to do when not an existing directory
참고 : 조심하십시오. 개폐식 버팀대 양쪽에 빈 공간을 두십시오.
동일한 구문으로 다음을 사용할 수 있습니다.
-e: any kind of archive
-f: file
-h: symbolic link
-r: readable file
-w: writable file
-x: executable file
-s: file size greater than zero
디렉토리 또는 파일이 있는지 여부를 테스트하는 간단한 스크립트 :
if [ -d /home/ram/dir ] # For file "if [-f /home/rama/file]"
then
echo "dir present"
else
echo "dir not present"
fi
디렉토리가 있는지 여부를 확인하는 간단한 스크립트 :
mkdir tempdir # If you want to check file use touch instead of mkdir
ret=$?
if [ "$ret" == "0" ]
then
echo "dir present"
else
echo "dir not present"
fi
위의 스크립트는 디렉토리가 있는지 여부를 확인합니다.
$? 마지막 명령이 성공하면 "0", 그렇지 않으면 0이 아닌 값을 반환합니다. tempdir이미 존재 한다고 가정하십시오 . 그런 다음 mkdir tempdir아래와 같은 오류가 발생합니다.
mkdir : 'tempdir'디렉토리를 작성할 수 없습니다 : 파일이 존재합니다
사용할 수 있습니다 test -d(참조 man test).
-d file파일이 존재하고 디렉토리이면 참입니다.
예를 들면 다음과 같습니다.
test -d "/etc" && echo Exists || echo Does not exist
참고 : test명령은 조건식 [(: 참조 man [)과 동일하므로 셸 스크립트에서 이식 가능합니다.
[- 이것은 동의어입니다test내장,하지만 마지막 인수해야는 문자 그대로]개통을 일치하도록[.
가능한 옵션 또는 추가 도움이 필요하면 다음을 확인하십시오.
help [help testman test 또는 man [또는 완전히 쓸모없는 것을 위해 :
[ -d . ] || echo "No"
다음은 매우 실용적인 관용구입니다.
(cd $dir) || return # Is this a directory,
# and do we have access?
나는 일반적으로 그것을 함수로 포장 :
can_use_as_dir() {
(cd ${1:?pathname expected}) || return
}
또는:
assert_dir_access() {
(cd ${1:?pathname expected}) || exit
}
이 방법의 좋은 점은 좋은 오류 메시지를 생각할 필요가 없다는 것입니다.
cd표준 오류에 대한 표준 한 줄 메시지를 이미 제공합니다. 또한 내가 제공 할 수있는 것보다 더 많은 정보를 제공 할 것입니다. cdsubshell 내부 를 수행하면 ( ... )명령은 호출자의 현재 디렉토리에 영향을 미치지 않습니다. 디렉토리가 존재하면이 서브 쉘과 기능은 작동하지 않습니다.
다음은 우리가 통과한다는 주장이다 cd: ${1:?pathname expected}. 이는보다 정교한 매개 변수 대체 형식으로 아래에 자세히 설명되어 있습니다.
Tl; dr :이 함수에 전달 된 문자열이 비어 있으면 다시 서브 쉘 ( ... )에서 나와 주어진 오류 메시지와 함께 함수에서 돌아옵니다.
ksh93매뉴얼 페이지 에서 인용 :
${parameter:?word}
parameter설정되어 있고 널이 아닌 경우 해당 값을 대체하십시오. 그렇지 않으면,word대화식이 아닌 경우 쉘에서 인쇄 하고 종료하십시오. 경우word다음 생략 표준 메시지가 출력된다.
과
콜론
:이 위의 표현식에서 생략 되면, 쉘은 매개 변수 설정 여부 만 검사합니다.
여기에서 문구는 word공백을 포함하여 모든 합리적인 문자열을 참조 할 수 있는 쉘 문서에 고유합니다 .
이 특별한 경우에는 표준 오류 메시지 1: parameter not set가 충분하지 않다는 것을 알고 있으므로 여기서 예상되는 값의 유형 인 pathname디렉토리를 확대합니다.
철학적 메모 :
쉘은 객체 지향 언어가 아니기 때문에 메시지가 pathname아니라고 말합니다 directory. 이 수준에서는 간단하게 유지하고 싶습니다. 함수에 대한 인수는 문자열입니다.
test -d@Grundlefleck이 설명한 것과 같습니다.
test -d /unreadable/exists인수가 존재하더라도 실패합니다.
if [ -d "$Directory" -a -w "$Directory" ]
then
#Statements
fi
위의 코드는 디렉토리가 존재하고 쓰기 가능한지 점검합니다.
Bash 프롬프트에서이 코드를 입력하십시오.
if [ -d "$DIRECTORY" ]; then
# If true this block of code will execute
fi
find하위 디렉토리 내에 폴더가 있는지 확인하십시오.
found=`find -type d -name "myDirectory"`
if [ -n "$found"]
then
# The variable 'found' contains the full path where "myDirectory" is.
# It may contain several lines if there are several folders named "myDirectory".
fi현재 디렉토리 내의 패턴을 기반으로 하나 이상의 폴더가 있는지 확인하십시오.
found=`find -maxdepth 1 -type d -name "my*"`
if [ -n "$found"]
then
# The variable 'found' contains the full path where folders "my*" have been found.
fi두 가지 조합. 다음 예제에서는 현재 디렉토리에 폴더가 있는지 확인합니다.
found=`find -maxdepth 1 -type d -name "myDirectory"`
if [ -n "$found"]
then
# The variable 'found' is not empty => "myDirectory"` exists.
fifind -maxdepth 1 -type d -name 'pattern'. 이 트릭을 당신의 대답에 추가해도 될까요? 건배;)
실제로 몇 가지 도구를 사용하여 방탄 방법을 사용해야합니다.
DIR_PATH=`readlink -f "${the_stuff_you_test}"` # Get rid of symlinks and get abs path
if [[ -d "${DIR_PATH}" ]] ; Then # Now you're testing
echo "It's a dir";
fi
사용하는 한 공백과 특수 문자에 대해 걱정할 필요가 없습니다 "${}".
참고 [[]]로 휴대용으로하지 않습니다 [],하지만 대부분의 사람들은 강타의 현대 버전에서 작동하기 때문에 (결국 때문에, 대부분의 사람들이하지 명령 줄 - P 심지어 일을)는 이점은 문제보다 더 크다.
당신은 당신 if이 도약하기 전에보다 오히려 당신이하고 싶은 일을하는 것을 고려 했습니까 ?
즉, 디렉토리에 들어가기 전에 디렉토리가 있는지 확인하려면 다음을 수행하십시오.
if pushd /path/you/want/to/enter; then
# Commands you want to run in this directory
popd
fi
제공 한 경로가 pushd존재 하면 경로를 입력하고로 종료합니다 0. 이는 then명령문 의 일부가 실행 됨을 의미합니다 . 디렉토리가 존재하지 않으면 아무 것도 발생하지 않습니다 (디렉토리가 존재하지 않는다는 일부 출력 이외의 것으로 디버깅에 유용한 부작용 일 수 있습니다).
이보다 더 나은 것 같아서 반복해야합니다.
if [ -d /path/you/want/to/enter ]; then
pushd /path/you/want/to/enter
# Commands you want to run in this directory
popd
fi
같은 일이 함께 작동 cd, mv, rm존재하지 않는 파일에 그들을하려고하면, 그들은 오류와 함께 종료하고 존재하지 않는 없다는 메시지를 인쇄하고 있습니다 ... 등 then블록은 건너 뜁니다. 당신이 존재 할 파일에 그들을 시도하는 경우, 명령의 상태로 실행하고 종료됩니다 0귀하의 수, then블록이 실행.
둘 이상의 디렉토리를 확인하려면이 코드를 사용하십시오.
if [ -d "$DIRECTORY1" ] && [ -d "$DIRECTORY2" ] then
# Things to do
fi
디렉토리가 존재하는지 확인하십시오. 그렇지 않으면 다음을 작성하십시오.
[ -d "$DIRECTORY" ] || mkdir $DIRECTORY
mkdir -p "$DIRECTORY"같은 효과에 사용할 수 있습니다 .
[[ -d "$DIR" && ! -L "$DIR" ]] && echo "It's a directory and not a symbolic link"
주의 : 변수를 인용하는 것이 좋습니다.
설명:
-d: 디렉토리인지 확인-L: 심볼릭 링크인지 확인[ -d ~/Desktop/TEMPORAL/ ] && echo "DIRECTORY EXISTS" || echo "DIRECTORY DOES NOT EXIST"
이 답변 은 쉘 스크립트로 싸여 있습니다.
$ is_dir ~
YES
$ is_dir /tmp
YES
$ is_dir ~/bin
YES
$ mkdir '/tmp/test me'
$ is_dir '/tmp/test me'
YES
$ is_dir /asdf/asdf
NO
# Example of calling it in another script
DIR=~/mydata
if [ $(is_dir $DIR) == "NO" ]
then
echo "Folder doesnt exist: $DIR";
exit;
fi
function show_help()
{
IT=$(CAT <<EOF
usage: DIR
output: YES or NO, depending on whether or not the directory exists.
)
echo "$IT"
exit
}
if [ "$1" == "help" ]
then
show_help
fi
if [ -z "$1" ]
then
show_help
fi
DIR=$1
if [ -d $DIR ]; then
echo "YES";
exit;
fi
echo "NO";
if [ -d "$DIRECTORY" ]; then
# Will enter here if $DIRECTORY exists
fi
이것은 완전히 사실이 아닙니다 ...
해당 디렉토리로 이동하려면 디렉토리에 대한 실행 권한도 있어야합니다. 쓰기 권한이 필요할 수도 있습니다.
따라서:
if [ -d "$DIRECTORY" ] && [ -x "$DIRECTORY" ] ; then
# ... to go to that directory (even if DIRECTORY is a link)
cd $DIRECTORY
pwd
fi
if [ -d "$DIRECTORY" ] && [ -w "$DIRECTORY" ] ; then
# ... to go to that directory and write something there (even if DIRECTORY is a link)
cd $DIRECTORY
touch foobar
fi
file프로그램을 사용하십시오 . 모든 디렉토리가 Linux에서도 파일임을 고려하면 다음 명령을 실행하면 충분합니다.
file $directory_name
존재하지 않는 파일 확인 : file blah
산출: cannot open 'blah' (No such file or directory)
기존 디렉토리 확인 : file bluh
산출: bluh: directory
ls와 함께 명령 -l(긴 목록) 옵션을 반환 파일과 디렉토리에 대한 정보를 속성.
특히 ls -l출력 의 첫 문자 는 대개 a d또는 -(대시)입니다. (A)의 경우 d나열된 하나 확실히 디렉토리입니다.
한 줄로 된 다음 명령은 주어진 ISDIR변수에 디렉토리 경로가 포함되어 있는지 여부를 알려줍니다 .
[[ $(ls -ld "$ISDIR" | cut -c1) == 'd' ]] &&
echo "YES, $ISDIR is a directory." ||
echo "Sorry, $ISDIR is not a directory"
실제 사용법 :
[claudio@nowhere ~]$ ISDIR="$HOME/Music"
[claudio@nowhere ~]$ ls -ld "$ISDIR"
drwxr-xr-x. 2 claudio claudio 4096 Aug 23 00:02 /home/claudio/Music
[claudio@nowhere ~]$ [[ $(ls -ld "$ISDIR" | cut -c1) == 'd' ]] &&
echo "YES, $ISDIR is a directory." ||
echo "Sorry, $ISDIR is not a directory"
YES, /home/claudio/Music is a directory.
[claudio@nowhere ~]$ touch "empty file.txt"
[claudio@nowhere ~]$ ISDIR="$HOME/empty file.txt"
[claudio@nowhere ~]$ [[ $(ls -ld "$ISDIR" | cut -c1) == 'd' ]] &&
echo "YES, $ISDIR is a directory." ||
echo "Sorry, $ISDIR is not a directoy"
Sorry, /home/claudio/empty file.txt is not a directory
실제 디렉토리인지 또는 심볼릭 링크인지에 관계없이 디렉토리가 존재하는지 확인하려면 다음을 사용하십시오.
ls $DIR
if [ $? != 0 ]; then
echo "Directory $DIR already exists!"
exit 1;
fi
echo "Directory $DIR does not exist..."
설명 : "ls"명령은 디렉토리 또는 심볼릭 링크가 존재하지 않으면 "ls : / x : 해당 파일 또는 디렉토리가 없습니다"라는 오류를 표시하고 "$?"를 통해 검색 할 수있는 리턴 코드를 비로 설정합니다. -null (일반적으로 "1"). "ls"를 호출 한 후 리턴 코드를 직접 확인하십시오.
if ! ls $DIR 2>/dev/null; then echo "$DIR does not exist!"; fi
(1)
[ -d Piyush_Drv1 ] && echo ""Exists"" || echo "Not Exists"
(2)
[ `find . -type d -name Piyush_Drv1 -print | wc -l` -eq 1 ] && echo Exists || echo "Not Exists"
(삼)
[[ -d run_dir && ! -L run_dir ]] && echo Exists || echo "Not Exists"
위에 제공된 방법 중 하나에 문제가있는 경우 :
와 ls명령; 디렉토리가 존재하지 않는 경우-오류 메시지가 표시됨
[[ `ls -ld SAMPLE_DIR| grep ^d | wc -l` -eq 1 ]] && echo exists || not exists
-ksh : 찾을 수 없음 : 해당 파일 또는 디렉토리가 없습니다.
훌륭한 해결책이 있지만 올바른 디렉토리에 있지 않으면 모든 스크립트가 실패합니다. 따라서 다음과 같은 코드를 작성하십시오.
if [ -d "$LINK_OR_DIR" ]; then
if [ -L "$LINK_OR_DIR" ]; then
# It is a symlink!
# Symbolic link specific commands go here
rm "$LINK_OR_DIR"
else
# It's a directory!
# Directory command goes here
rmdir "$LINK_OR_DIR"
fi
fi
실행 시점에 확인하려는 하위 디렉토리가있는 디렉토리에있는 경우에만 성공적으로 실행됩니다.
파일 시스템에서의 사용자 위치와 상관없이 디렉토리가 존재하는지 확인하기 위해 다음과 같은 초기 질문을 이해합니다. 따라서 'find'명령을 사용하면 트릭을 수행 할 수 있습니다.
dir=" "
echo "Input directory name to search for:"
read dir
find $HOME -name $dir -type d
이 솔루션은 파일 / 디렉토리를 검색 할 때 유용한 기능인 와일드 카드를 사용할 수 있기 때문에 좋습니다. 유일한 문제는, 검색된 디렉토리가 존재하지 않으면, 'find'명령은 표준 출력 ( 아무것도 미묘한 해결책은 아님)으로 아무것도 출력 하지 않으며 그럼에도 불구하고 제로 이탈이 있다는 것입니다. 누군가가 이것을 개선 할 수 있습니다.
locate좋지만 다른 도구에는 좋지 않을 수도 있습니다 .
--강력히 권장합니다 (옵션 끝 표식). 그렇지 않으면 변수에 옵션처럼 보이는 것이 있으면 공백과 마찬가지로 스크립트가 실패합니다.