programing

Bash 셸 스크립트에 디렉토리가 있는지 확인하려면 어떻게 해야 합니까?

bestprogram 2023. 5. 2. 23:06

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"
  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' 디렉토리를 생성할 수 없습니다. 파일이 있습니다.

디리가존확면단사다용니합순을려를 사용하면 .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블록을 건너뜁니다.는 " 하는파일이시실다명종다상니료됩태로음존고재"입니다.0then실행할 블록입니다.

[[ -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