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

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



답변

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

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

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


답변

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


답변

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

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


답변

더 짧은 형태 :

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


답변

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


답변

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