Bash 셸 스크립트에 디렉토리가 있는지 확인하려면 어떻게 해야 합니까?
Bash 셸 스크립트 내에 디렉토리가 있는지 확인하는 명령은 무엇입니까?
디렉터리가 있는지 확인하는 방법
if [ -d "$DIRECTORY" ]; then
echo "$DIRECTORY does exist."
fi
디렉터리가 존재하지 않는지 확인하는 방법
if [ ! -d "$DIRECTORY" ]; then
echo "$DIRECTORY does not 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에 의해 설명됩니다.
변수에 공백이나 기타 비정상적인 문자가 포함되어 있으면 스크립트가 실패할 수 있습니다.
Bash 스크립트에서 변수를 참조할 때는 항상 큰따옴표로 묶어야 합니다.
if [ -d "$DIRECTORY" ]; then
# Will enter here if $DIRECTORY exists, even if it contains spaces
fi
요즘 아이들은 디렉토리 이름에 공백과 많은 다른 재미있는 캐릭터들을 넣었습니다.(공백!제 시절에는, 우리는 화려한 공간이 없었습니다!)그중 한 할 것입니다.$DIRECTORY
로 설정한."My M0viez"
당신의 대본이 폭발할 겁니다당신은 그것을 원하지 않습니다.큰따옴표를 사용합니다.
-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 매뉴얼에서 확인할 수 있습니다.
의 더블 브래킷 버전을 찾습니다.test
쓰기 논리 테스트를 보다 자연스럽게 만듭니다.
if [[ -d "${DIRECTORY}" && ! -L "${DIRECTORY}" ]] ; then
echo "It's a bona-fide directory"
fi
더 짧은 형식:
# if $DIR is a directory, then print yes
[ -d "$DIR" ] && echo "Yes"
디렉터리 또는 파일의 존재 여부를 테스트하는 간단한 스크립트:
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' 디렉토리를 생성할 수 없습니다. 파일이 있습니다.
디리가존확면단사다용니합순을려를 사용하면 .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
사용할 수 있습니다.test -d
)man test
).
-d file
파일이 존재하고 디렉토리인 경우 true입니다.
예:
test -d "/etc" && echo Exists || echo Does not exist
참고: Thetest
명이조같습다니과식건과 .[
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
( ... )
이 명령은 호출자의 현재 디렉터리에 영향을 주지 않습니다.디렉터리가 존재하는 경우 이 하위 셸과 함수는 no-op에 불과합니다.
다음은 우리가 넘겨주는 주장입니다.cd
:${1:?pathname expected}
이는 아래에서 더 자세히 설명하는 보다 정교한 매개 변수 대체 형식입니다.
Tl;dr: 이 함수에 전달된 문자열이 비어 있으면 하위 셸에서 다시 종료됩니다.( ... )
지정된 오류 메시지와 함께 함수에서 반환됩니다.
의 ksh93
page 파일:
${parameter:?word}
한다면
parameter
이 아닌 인쇄합니다. 그렇지 않으면 인쇄합니다.word
셸을 종료합니다(대화형이 아닌 경우).한다면word
를 생략하면 표준 메시지가 인쇄됩니다.
그리고.
대장이 이장대이
:
위 식에서 생략된 다음, 셸은 매개 변수가 설정되었는지 여부만 확인합니다.
여기에 있는 문구는 셸 문서에 고유합니다.word
공백을 포함한 모든 적절한 문자열을 참조할 수 있습니다.
이 경우 표준 오류 메시지가1: parameter not set
않기 인 충하지않다니습을 . 그래서 저는 우리가 여기서 기대하는 값의 유형을 확대합니다.pathname
디렉토리의
철학적 노트:
셸은 객체 지향 언어가 아니므로 메시지는 다음과 같이 말합니다.pathname
,것은 아니다.directory
이 수준에서는 단순하게 유지하고 싶습니다. 함수에 대한 인수는 문자열에 불과합니다.
if [ -d "$Directory" -a -w "$Directory" ]
then
#Statements
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
DIRECTORY=/tmp
if [ -d "$DIRECTORY" ]; then
echo "Exists"
fi
실제로 방탄 처리 방식을 사용하려면 다음과 같은 여러 도구를 사용해야 합니다.
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
는 걱정할 필요가 없습니다."${}"
.
:[[]]
만큼 휴대가 용이하지 않습니다.[]
그러나 대부분의 사람들이 최신 버전의 Bash로 작업하기 때문에(결국 대부분의 사람들은 명령줄 :-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
실행할 블록입니다.
[[ -d "$DIR" && ! -L "$DIR" ]] && echo "It's a directory and not a symbolic link"
N.B: 변수를 인용하는 것은 좋은 관행입니다.
설명:
-d
-L
하세요.
둘 이상의 디렉토리를 확인하려면 다음 코드를 사용합니다.
if [ -d "$DIRECTORY1" ] && [ -d "$DIRECTORY2" ] then
# Things to do
fi
디렉토리가 존재하는지 확인하고, 그렇지 않으면 디렉토리를 작성합니다.
[ -d "$DIRECTORY" ] || mkdir $DIRECTORY
[ -d ~/Desktop/TEMPORAL/ ] && echo "DIRECTORY EXISTS" || echo "DIRECTORY DOES NOT EXIST"
-e
체크는 파일을 확인하며 디렉토리도 포함합니다.
if [ -e ${FILE_PATH_AND_NAME} ]
then
echo "The file or directory exists."
fi
이 답변은 셸 스크립트로 마무리되었습니다.
예
$ 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
is_message
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";
조나단의 논평에 따르면:
은 디렉터리를 사용하는 것입니다.mkdir -p
디렉터리를 생성하고 디렉터리가 이미 존재하는 경우에도 오류가 발생하지 않으므로 다음을 사용하여 한 번에 모든 작업을 수행할 수 있습니다.
mkdir -p /some/directory/you/want/to/exist || exit 1
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
일종의 3성분의 형태로,
[ -d "$directory" ] && echo "exist" || echo "not exist"
사용:
test -d "$directory" && echo "exist" || echo "not exist"
file="foo"
if [[ -e "$file" ]]; then echo "File Exists"; fi;
그ls
를 와명령과 합니다.-l
(긴 목록) 옵션은 파일 및 디렉터리에 대한 특성 정보를 반환합니다.
특첫 번째캐는터의 첫 ls -l
은 보통 출력그입보통다니은것입▁usually다▁output니▁it입니다.d
는또.-
( ). 의우의 .d
목록에 있는 것은 확실히 디렉토리입니다.
다음 명령을 한 줄로 입력하면 지정된 변수에 디렉터리 경로가 포함되어 있는지 여부를 알 수 있습니다.
[[ $(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
훌륭한 해결책들이 있지만, 궁극적으로 올바른 디렉터리에 있지 않으면 모든 스크립트가 실패할 것입니다.그래서 다음과 같은 코드:
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
실행 시점에 우연히 확인할 수 있는 하위 디렉터리가 있는 디렉터리에 있는 경우에만 성공적으로 실행됩니다.
파일 시스템에서 사용자의 위치에 관계없이 디렉터리가 존재하는지 확인하는 것과 같은 첫 번째 질문을 이해합니다.따라서 '찾기' 명령을 사용하면 다음과 같은 작업을 수행할 수 있습니다.
dir=" "
echo "Input directory name to search for:"
read dir
find $HOME -name $dir -type d
이 솔루션은 파일/디렉토리를 검색할 때 유용한 기능인 와일드카드를 사용할 수 있기 때문에 좋습니다.유일한 문제는 검색된 디렉터리가 존재하지 않는 경우 '찾기' 명령은 표준 출력으로 아무것도 인쇄하지 않으며(내 취향에 맞는 우아한 솔루션이 아님) 그럼에도 불구하고 종료가 0이 된다는 것입니다.아마 누군가가 이것을 개선할 수 있을 것입니다.
의 아의래find
사용할 수 있습니다.
find . -type d -name dirname -prune -print
라이너 하나:
[[ -d $Directory ]] && echo true
(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"
(3)
[[ -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: not: not found [해당 파일 또는 디렉토리 없음]
언급URL : https://stackoverflow.com/questions/59838/how-do-i-check-if-a-directory-exists-or-not-in-a-bash-shell-script
'programing' 카테고리의 다른 글
WPF 탭 컨트롤에서 탭 항목을 프로그래밍 방식으로 선택하는 방법 (0) | 2023.05.07 |
---|---|
연결이 끊긴 멀티플렉서를 만들기 위해 redis 서버에 연결할 수 없습니다. (0) | 2023.05.07 |
XCode 명령줄 도구가 설치되어 있는지 확인하는 방법은 무엇입니까? (0) | 2023.05.02 |
제가 언제 수업 대신 구조체를 사용해야 합니까? (0) | 2023.05.02 |
노드 서버를 사용하여 MongoDB에 연결 시 주의 사항 (0) | 2023.05.02 |