문제
어떤 명령을 사용할 수 있습니다 경우 확인하는 디렉토리가 존재하는지,내 쉘 스크립트를 사용해야 할까요?
해결책
을 확인하는 경우 디렉토리에 있는 쉘 스크립트는 다음을 사용할 수 있습니다:
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 에릭슨 점,이후의 명령을 작동하지 않을 수도 있습으로 의도를 가지고 가지 않는 경우에 당신은 계정으로는 상징적인에 대한 링크를 directory 또한 것이 확인합니다.E.g.실행 this:
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 스크립트입니다.아이들이 이 일을 성장 하는 생각을 가질 수 있는 공간과 다른 많은 재미있는 캐릭터들의 디렉터리에 이름이 있습니다.(공간!뒤에서 나의 일을,우리는지 없는 멋진 공간!;))
어느 날,그 아이들이 실행하는 스크립트로 $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 조건 표현식 고 [
명령을 내장 고 [[
화합물 명령.
내가 찾기 double-브라켓 버 test
쓰도록 논리 테스트를 더욱 자연적인:
if [[ -d "${DIRECTORY}" && ! -L "${DIRECTORY}" ]] ; then
echo "It's a bona-fide directory"
fi
짧은 형태:
[ -d "$DIR" ] && echo "Yes"
을 확인하는 경우 디렉토리가 있는 사용할 수 있는 간단하는 경우 구조는 다음과 같다:
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 "$DIRECTORY" ]; then
# Here if $DIRECTORY exists
fi
당신이 사용할 수 있는 test -d
(참조하십시오 man test
).
-d file
진정한 파일이 존재하는 경우와 디렉터리입니다.
예를 들어:
test -d "/etc" && echo Exists || echo Does not exist
참고:이 test
명령과 같은 조건 표현식 [
(참조하십시오: man [
다),그래서 그것은 휴대용 전 쉘 스크립트가 있습니다.
[
-이에 대한 동의어test
내장,그러나 마지막 아규먼트는,리터럴]
, 맞게 개[
.
가능한 옵션 또는 추가 도움말 체크인:
help [
help test
man test
나man [
간단한 스크립트를 테스트하는 경우 dir 또는 파일이 존재하는지:
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
위의 스크립트를 확인 dir 존재하는지
$?
는 경우 마지막 명령을 성공이 반환한다"0"다른 비로 값입니다.가tempdir
이미 존재 다음mkdir tempdir
을 줄 것이 오류는 아래와 같다:mkdir:을 만들 수 없습 directory'tempdir':파일이 있는
또는 완전히 뭔가를 쓸모없:
[ -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
이 나에게 표준 중 하나인 메시지를 stderr 니다.그것은 또한 더 많은 정보를 제공보다는 나을 것입 제공할 수 있습니다.에 의해 수행 cd
내점이 존재한다. ( ... )
, 명령에 영향을 미치지 않는 현재 디렉토리의 발신번호를 입력하실 수 있습니다.는 경우 디렉토리가 존재하는 이점이 존재한다.그리고 기능은 no-op.
다음 인수는 우리가 전달할 cd
: ${1:?pathname expected}
.이것은 더 정교한 형태의 매개 변수는 교체는 아래서 자세히 설명.
Tl;박사:는 경우 전달된 문자열로 이 기능은 빈,우리가 다시 출구에서점이 존재한다. ( ... )
고에서 반환 기능은 주어진 오류 메시지가 표시됩니다.
에서 인용 ksh93
남자 페이지:
${parameter:?word}
는 경우
parameter
세이 null 이 아닌 그런 다음 대신 값;그렇지 않으면,프린트word
출 쉘(하지 않을 경우 인터랙티브).는 경우word
생략하면 표준이 메시지가 인쇄됩니다.
고
는 경우 콜론
:
생략하면서 위의 표현,다음 쉘 여부를 확인 매개변수를 설정하거나지 않습니다.
말씨 여기에는 독특한 쉘에 문서 word
참조할 수 있습니다
모든 합리적인 문자열을 포함하여,공백.
이 특정한 경우,저는 오류 메시지가 표준 1: parameter not set
가 충분하지 않은,그래서 저는 확대에서의 유형에 가치는 우리가 기대하기 pathname
의 디렉토리에 있습니다.
A philosphical 참고:쉘지 않는 객체지향적인 언어,그래서 메시지가 말 pathname
, 지 directory
.이 수준에서,오히려 그것을 지키는 간단한 인수 함수는 문자열입니다.
if [ -d "$Directory" -a -w "$Directory" ]
then
#Statements
fi
위의 코드를 확인합하는 경우 디렉토리가 존재하는 경우 그것은 쓸 수 없습니다.
에서 이 코드를 입력 bash promt
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
실제로,당신은 사용해야 한다는 몇 가지 도구를 얻는 방탄소 방법:
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
에 대해 걱정할 필요가 없 공간과 같은 특수 문자를 사용하는 동안 "${}"
.
Note [[]]
지 않으로 휴대용으로 []
, 지만,대부분의 사람들과 함께 작업 현대적인 버전의 Bash(이후 모든 후,대부분의 사람들은 심지어 일으로 명령:-p),혜택보다 더 큰 문제입니다.
을 확인하는 둘 이상의 디렉토리 코드를 사용합니다.
if [ -d "$DIRECTORY1" ] && [ -d "$DIRECTORY2" ] then
# Things to do
fi
당신이 그냥 당신이 무엇을 하고 싶 if
보기 전에 당신은 도?
IE,를 확인하려면의 존재에 대한 디렉토리 입력하기 전에,그것도 그냥 하는 이것:
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 "$DIRECTORY" ] || mkdir $DIRECTORY
[[ -d "$DIR" && ! -L "$DIR" ]] && echo "It's a directory and not a symbolic link"
N.B:인용 변수 이하로 유지하는 것이 좋습니다.
[ -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
is_dir
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";
를 사용하는 -e
체크인 파일에 대한 이 포함되어 있 디렉토리입니다.
if [ -e ${FILE_PATH_AND_NAME} ]
then
echo "The file or directory exists."
fi
당로 요나단 의견:
당신이 원하는 디렉터리를 만들고 그것은 아직 존재하지 않는,다음의 간단한 기법을 사용하는 것입 mkdir -p
는 디렉터리를 만들고 누락된 디렉토리 경로—그리고 실패하지 않는 경우 디렉터 이미 존재하는,그래서 당신은 그것을 할 수 있는 한번에 모두와 함께:
mkdir -p /some/directory/you/want/to/exist || exit 1
if [ -d "$DIRECTORY" ]; then
# Will enter here if $DIRECTORY exists
fi
이것은 완전하지 않다.당신이 가고 싶어하는 디렉토리에,당신은 또한이 있어야 실행 권한에 디렉토리에 있습니다.어쩌면 당신은 필요가 있는 쓰기 권한을 뿐입니다.
Therfore:
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
이 ls
명령에서와 함께 -l
(긴 목록)옵션을 반환합성에 대한 정보를 파일과 디렉터리입니다.
특히 첫 문의 ls -l
출력 그것은 일반적으로 d
나 -
(dash).의 경우에는 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
file="foo"
if [[ -e "$file" ]]; then echo "File Exists"; fi;
하려면 체크인 경우 디렉토리가 존재하는 경우에 관계없이,그것의 진정한 디렉토리 또는 심볼릭 링크,이것을 사용:
ls $DIR
if [ $? != 0 ]; then
echo "Directory $DIR already exists!"
exit 1;
fi
echo "Directory $DIR does not exist..."
설명:The"ls"명령을 제공는 오류"ls:/x:그런 파일이나 디렉토리"는 경우 디렉토리 또는 심볼릭 링크가 존재하지 않고도 설정합니다 반환코드를 반환하는 검색할 수 있습을 통해"$?", non-null(일반적으로"1").확실히 당신이 체크의 반환에 직접 코드를 호출한 후에"ls".
(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
-eq1]]&&echo 있||존재하지 않는
-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
가 성공적으로 실행되는 경우에만의 순간에 실행 당신은 디렉토리에 있는 하위디렉토리는 당신이 일어나에 대한 확인.
내가 이해 초기 질문은 다음과 같다:지 확인하려면 디렉토리가 존재하는지 관계없이 사용자의 위치에서 파일 시스템입니다.그래서 명령을 사용하여'찾기'트릭을 할 수 있습니다:
dir=" "
echo "Input directory name to search for:"
read dir
find $HOME -name $dir -type d
이 솔루션은 좋기 때문에 사용하도록 허용하는 와일드카드,유용한 기능 파일 검색/디렉터리입니다.는 경우 검색 디렉토리가 존재하지 않'찾기'명령을 인쇄할 것이 아무것도 stdout(지 않은 우아한 솔루션에 대한 나의 맛)고 있을 것이다 그럼에도 불구하고 제로에 종료됩니다.어쩌면 사람을 개선할 수 있습니다.
아래 찾는 사용할 수 있습니다,
find . -type d -name dirname -prune -print