Bash 쉘 스크립트에 디렉토리가 있는지 어떻게 확인합니까?


3721

Bash 쉘 스크립트 내에 디렉토리가 존재하는지 여부를 확인하는 데 사용할 수있는 명령은 무엇입니까?

답변:


5147

쉘 스크립트에 디렉토리가 있는지 확인하려면 다음을 사용할 수 있습니다.

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 의해 설명됩니다 .

변수에 공백이나 다른 특수 문자가 포함되어 있으면 스크립트가 실패 할 수 있습니다.


29
GNU 도구를 사용하여 안전하게 재생하려면 사용을 --강력히 권장합니다 (옵션 끝 표식). 그렇지 않으면 변수에 옵션처럼 보이는 것이 있으면 공백과 마찬가지로 스크립트가 실패합니다.
Marc Mutz-mmutz

2
등 bash는, KSH의 현대 버전의 [...]는 내장입니다
fpmurphy

79
한 가지 유념해야 할 점은 : [ ! -d "$DIRECTORY" ]하나 경우에 true가됩니다 $DIRECTORY존재하지 않는 경우, 또는 않는 존재를하지만, 디렉토리가 아니다. 다음과 같은 것을 고려하십시오 if [ ! -d "$DIRECTORY" ] ; then mkdir "$DIRECTORY" ; fi. "$DIRECTORY"파일 인 경우 실패 합니다. (물론 mkdir어쨌든 성공 했는지 확인해야 합니다. 실패 할 수있는 여러 가지 이유가 있습니다.)
Keith Thompson

5
점검이 수행 되 자마자 상황은 다른 프로세스로 인해 이미 변경되었을 수 있습니다. 대부분의 경우 디렉토리를 작성하거나 사용하고 실패에 대응하는 것이 좋습니다.
Alfe

12
디렉토리 ( -d)와 심볼릭 링크 ( -L) 를 모두 테스트하는 대신 변수에 슬래시를 추가하는 것이 더 쉽습니다 (예 :) if [ -d "${THING:+$THING/}" ]. 디렉토리는 추가 슬래시를 신경 쓰지 않습니다. 파일은 거짓으로 평가됩니다. 공란은 공란으로 유지되므로 거짓입니다. 그리고 심볼릭 링크는 목적지로 결정됩니다. 물론 그것은 당신의 목표에 달려 있습니다. 거기 에 가고 싶다면 괜찮습니다. 당신이 할 경우 삭제 , 다음이 답변의 코드가 더 좋다.
ghoti

530

Bash 스크립트에서 변수를 참조 할 때는 항상 큰 따옴표로 묶어야합니다. 요즘 아이들은 디렉토리 이름에 공백과 다른 많은 재미있는 캐릭터를 가질 수 있다는 생각으로 자랍니다. (공백! 나의 시대에, 우리는 공상 공간이 없었습니다!;))

어느 날, 그 아이들 중 한 명이로 $DIRECTORY설정된 상태에서 스크립트를 실행 "My M0viez"하면 스크립트가 폭발합니다. 당신은 그것을 원하지 않습니다. 이것을 사용하십시오.

if [ -d "$DIRECTORY" ]; then
    # Will enter here if $DIRECTORY exists, even if it contains spaces
fi

9
큰 따옴표를 사용하는 또 다른 이유는 $ DIRECTORY가 어떤 이유로 설정되지 않은 경우입니다.
Jon Ericson

2
"항상 bash 스크립트에서 변수를 큰 따옴표로 묶습니다." bash의 경우 [[...]]를 사용할 때 기술적으로 필요하지 않습니다. tldp.org/LDP/abs/html/testconstructs.html#DBLBRACKETS 참조 (참고 : 단어 분리 없음) : "[[와]] 사이에서 파일 이름 확장이나 단어 분리가 발생하지 않지만 매개 변수 확장과 명령 대체가 있습니다."
마이클

2
유닉스 / 리눅스의 디렉토리에는 공백이 없어야하며, 그에 따라 스크립트를 적용해서는 안됩니다. Windows 스크립팅에 대한 모든 결과와 함께 Windows가 지원하는 것은 나쁘지만, 불필요한 요구 사항을 도입 할 필요는 없습니다.
tvCa

18
@tvCa 나는 사용자가 일반적으로 개발자가 일을 더 쉽게 만들지 않고 디렉토리 이름에 더 많은 유연성을 허용하는 것을 선호한다는 것을 알았습니다. (실제로 긴 파일 이름을 처리 할 때 공백이없는 파일은 스크립트와 프로그램에서 공백이있는 경로를 고려하지 않아서 과거에 어려움을 겪었더라도 단어 줄 바꿈을 죽이기 때문에 고통
스럽습니다

2
하아. 공백은 일반적으로 글리프가없는 문자입니다. 어쨌든 백 슬래시로 벗어날 수 있습니다.
uchuugaka

228

메모 -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 조건식[내장 명령[[복합 명령 에 대한 자세한 정보를 찾을 수 있습니다 .


12
또는 디렉토리에서만 작업해야하고 링크를 무시할 수 있다고 가정 할 경우 (= 링크는 무시할 수 있음) => if [ -d tmpdir -a ! -L tmpdir ]; then echo "is directory"; rmdir tmpdir; fi... 또는 링크와 디렉토리 모두에서 작동하는 하나의 명령에 대해 다음과 같습니다.rm -r tmpdir
michael

218

나는 찾을 이중 브라켓 버전 test로직 테스트를 더 자연스럽게 쓰는 브랜드를 :

if [[ -d "${DIRECTORY}" && ! -L "${DIRECTORY}" ]] ; then
    echo "It's a bona-fide directory"
fi

에 대한 if [[ -d "$TARFILE" ]][[: 찾을 수 없음
TheVillageIdiot

15
@TheVillageIdiot와 @Hedgehog, bash 쉘을 사용하고 있습니까? 이중 괄호는 보편적으로 지원되지 않습니다. 그 점에 대한 답변은 다음과 같습니다. stackoverflow.com/questions/669452/…
yukondude

6
Busybox ash에서는 기본 컴파일 옵션 [[ ]]이 지원되지만 실제로 다른 기능을 제공하지는 않습니다 [ ]. 이식성이 문제가되는 경우 [ ]필요한 해결 방법을 사용하십시오.
dubiousjim

6
... 쉘 스크립트에서 bash 구문을 사용하는 경우 스크립트의 첫 번째 행은 #! / bin / bash (#! / bin / sh, ksh 등이 아님)
michael

bash에서 큰 대괄호를 사용할 때는 변수를 인용 할 필요가 없습니다.
Hubert Grzeskowiak

157

더 짧은 형태 :

[ -d "$DIR" ] && echo "Yes"

6
이것은 다음과 같이 작동합니까 if $dir is a dir, then echo "yes"? 약간의 설명이 도움이 될 것입니다 :)
Martijn

5
cmd && other는 일반적인 약어입니다 if cmd; then other; fi. 이것은 부울 논리를 지원하는 대부분의 프로그래밍 언어에서 작동하며 단락 평가라고 합니다.
tripleee

1
동작은 동일하지 않습니다 set -e( 쉘 프로그래밍 모범 사례 ).
고인돌

1
@ dolmen the [ -d "$DIR" ]가 확인되고 (뒤에 && echo Yes) set -e스크립트 동작에 아무런 영향을 미치지 않는다고 생각 합니다 (예 : 테스트가 실패하면 스크립트가 정상적으로 계속됩니다).
tzot

132

디렉토리가 존재하는지 확인하려면 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

파일 스위치를 사용하여 주제를 벗어난 것을 제외하고 2008 년에 허용 된 답변보다 더 나은 점은 무엇입니까?
Dan Dascalescu

더 나은 이유는 [! -d 디렉토리 / 디렉토리 경로]
user1855805

108
  1. 디렉토리 또는 파일이 있는지 여부를 테스트하는 간단한 스크립트 :

    if [ -d /home/ram/dir ]   # For file "if [-f /home/rama/file]"
    then
        echo "dir present"
    else
        echo "dir not present"
    fi
    
  2. 디렉토리가 있는지 여부를 확인하는 간단한 스크립트 :

    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'디렉토리를 작성할 수 없습니다 : 파일이 존재합니다


4
두 번째 디렉토리는 처음에 디렉토리가 없으면 작성합니다. 그런 다음 dem 등성이 아닙니다.
Shihe Zhang

👆👆👆. 두 번째는 위험 해 보입니다. 디렉토리를 작성하기 때문에 디렉토리가 존재하지 않는 것은 더 이상 사실이 아닙니다.
크리스

92

사용할 수 있습니다 test -d(참조 man test).

-d file 파일이 존재하고 디렉토리이면 참입니다.

예를 들면 다음과 같습니다.

test -d "/etc" && echo Exists || echo Does not exist

참고 : test명령은 조건식 [(: 참조 man [)과 동일하므로 셸 스크립트에서 이식 가능합니다.

[- 이것은 동의어입니다 test내장,하지만 마지막 인수해야는 문자 그대로 ]개통을 일치하도록 [.

가능한 옵션 또는 추가 도움이 필요하면 다음을 확인하십시오.

  • help [
  • help test
  • man test 또는 man [

55

또는 완전히 쓸모없는 것을 위해 :

[ -d . ] || echo "No"

6
"No"는 인쇄되지 않습니다. 다른 스레드 나 다른 방법으로 삭제하지 않는 한 현재 디렉토리는 항상 존재합니다.
Jahid

완벽한 샘플 :) 주어진 답변과 비교할 때 "고유 한"답변이 몇 가지 답변 인 경우
Sergey Sargsyan

4
왜 이렇게 여러 차례 찬성 되었습니까? 질문에 대답하지 않습니다.
codeforester

그것은 최고의 답변 EVA이기 때문에
칼 모리슨

52

다음은 매우 실용적인 관용구입니다.

(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이 설명한 것과 같습니다.
F. Hauri

7
@ F.Hauri-그는 더 이상 아무 것도 요구하지 않았습니다. 그러나 나는 일반적으로 그 이상을 알아야한다는 것을 알았습니다.
Henk Langeveld

그리고 루트로 실행되지 않는 한 어떤 테스트도 결정적이지 않다는 것이 나에게 결코 발생하지 않았습니다. test -d /unreadable/exists인수가 존재하더라도 실패합니다.
Henk Langeveld

36
if [ -d "$Directory" -a -w "$Directory" ]
then
    #Statements
fi

위의 코드는 디렉토리가 존재하고 쓰기 가능한지 점검합니다.


1
-a는 -e와 사실상 동일합니다. "더 이상 사용되지 않으며"사용하지 않는 것이 좋습니다.
CousinCocaine

27
DIRECTORY=/tmp

if [ -d "$DIRECTORY" ]; then
    echo "Exists"
fi

온라인으로 시도


-> [``-dspace 후에 기억하십시오 . 공간이 없어서 오류가 발생했습니다[
Raj

4
다시 한번 ,이 답변은 2008 년에 이미 유용한 설명과 함께 제공되었습니다. 여기서 유일한 새로운 것은 온라인 놀이터입니다.
Dan Dascalescu

24

Bash 프롬프트에서이 코드를 입력하십시오.

if [ -d "$DIRECTORY" ]; then
    # If true this block of code will execute
fi

다시 한번 ,이 답변은 2008 년에 이미 주어졌습니다. 그것을 반복 할 때의 요점은 무엇입니까?!
Dan Dascalescu

21

사용하는 더 많은 기능 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'. 이 트릭을 당신의 대답에 추가해도 될까요? 건배;)
올리버

20

실제로 몇 가지 도구를 사용하여 방탄 방법을 사용해야합니다.

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 심지어 일을)는 이점은 문제보다 더 크다.


17

당신은 당신 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블록이 실행.


2
이 작업을 수행하는 가장 우아한 방법은 나에게 밀렸습니다. 답변으로 게시하려고했습니다 :)
melMass

15

둘 이상의 디렉토리를 확인하려면이 코드를 사용하십시오.

if [ -d "$DIRECTORY1" ] && [ -d "$DIRECTORY2" ] then
    # Things to do
fi

존재하지 않는지 어떻게 확인할 수 있습니까?
perrohunter

15

디렉토리가 존재하는지 확인하십시오. 그렇지 않으면 다음을 작성하십시오.

[ -d "$DIRECTORY" ] || mkdir $DIRECTORY

16
mkdir -p "$DIRECTORY"같은 효과에 사용할 수 있습니다 .
Logan Pickup

15
[[ -d "$DIR" && ! -L "$DIR" ]] && echo "It's a directory and not a symbolic link"

주의 : 변수를 인용하는 것이 좋습니다.

설명:

  • -d: 디렉토리인지 확인
  • -L: 심볼릭 링크인지 확인

설명은 순서대로 이루어집니다 ( 주석이 아닌 답변편집하여 ).
Peter Mortensen


11

이 답변 은 쉘 스크립트로 싸여 있습니다.

$ 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";

10

-e확인을 사용하면 파일이 확인되며 여기에는 디렉토리가 포함됩니다.

if [ -e ${FILE_PATH_AND_NAME} ]
then
    echo "The file or directory exists."
fi

1
그리고 OP의 질문에 올바르게 대답하지 못합니다-디렉토리입니까?
마크 스튜어트

8

당으로 조나단 의 코멘트 :

디렉토리를 작성하려고하지만 아직 존재하지 않는 경우, 가장 간단한 기술을 사용 mkdir -p하여 디렉토리를 작성하고 경로에 누락 된 디렉토리를 작성하고 디렉토리가 이미 존재하더라도 실패하지 않으므로 모든 작업을 수행 할 수 있습니다 한 번에 :

mkdir -p /some/directory/you/want/to/exist || exit 1

7
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

7

file프로그램을 사용하십시오 . 모든 디렉토리가 Linux에서도 파일임을 고려하면 다음 명령을 실행하면 충분합니다.

file $directory_name

존재하지 않는 파일 확인 : file blah

산출: cannot open 'blah' (No such file or directory)

기존 디렉토리 확인 : file bluh

산출: bluh: directory


1
좋은 생각이지만, 두 경우 모두 파일 명령이 0 종료 코드를 항상 반환합니다. 또한 파일 / 디렉토리를 찾을 수없는 경우 :(.
danger89

6

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

+1이지만 ISDIR이 전혀없는 경우 진단 메시지와 함께 오류 메시지가 표시됩니다.
ysap


5

실제 디렉토리인지 또는 심볼릭 링크인지에 관계없이 디렉토리가 존재하는지 확인하려면 다음을 사용하십시오.

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"를 호출 한 후 리턴 코드를 직접 확인하십시오.


3
또는이 짧은 버전을 사용할 수 있습니다.if ! ls $DIR 2>/dev/null; then echo "$DIR does not exist!"; fi
derFunk

5

(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 : 찾을 수 없음 : 해당 파일 또는 디렉토리가 없습니다.


"위"는 무엇을 의미합니까? 이 답변 또는 이전 답변의 세 가지 명령 줄? ( 댓글이 아닌 답변수정하여 답변 해주세요 . 미리 감사드립니다.).
Peter Mortensen

4

훌륭한 해결책이 있지만 올바른 디렉토리에 있지 않으면 모든 스크립트가 실패합니다. 따라서 다음과 같은 코드를 작성하십시오.

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'명령은 표준 출력 ( 아무것도 미묘한 해결책은 아님)으로 아무것도 출력 하지 않으며 그럼에도 불구하고 제로 이탈이 있다는 것입니다. 누군가가 이것을 개선 할 수 있습니다.


13
프로그램이 현재 작업 디렉토리를 공손하게 보거나 절대 경로를 사용하는 대신 디렉토리를 찾기 위해 하드 드라이브 전체를 살펴보면 기분이 상할 것입니다. 당신이 제안한 것은 이름이 붙여진 도구에는 locate좋지만 다른 도구에는 좋지 않을 수도 있습니다 .
sarnold
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.