답변:
쉘 스크립트에 디렉토리가 있는지 확인하려면 다음을 사용할 수 있습니다.
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 test
man 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
표준 오류에 대한 표준 한 줄 메시지를 이미 제공합니다. 또한 내가 제공 할 수있는 것보다 더 많은 정보를 제공 할 것입니다. cd
subshell 내부 를 수행하면 ( ... )
명령은 호출자의 현재 디렉토리에 영향을 미치지 않습니다. 디렉토리가 존재하면이 서브 쉘과 기능은 작동하지 않습니다.
다음은 우리가 통과한다는 주장이다 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.
fi
find -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
좋지만 다른 도구에는 좋지 않을 수도 있습니다 .
--
강력히 권장합니다 (옵션 끝 표식). 그렇지 않으면 변수에 옵션처럼 보이는 것이 있으면 공백과 마찬가지로 스크립트가 실패합니다.