문제

어떤 명령을 사용할 수 있습니다 경우 확인하는 디렉토리가 존재하는지,내 쉘 스크립트를 사용해야 할까요?

도움이 되었습니까?

해결책

을 확인하는 경우 디렉토리에 있는 쉘 스크립트는 다음을 사용할 수 있습니다:

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 testman [
  1. 간단한 스크립트를 테스트하는 경우 dir 또는 파일이 존재하는지:

    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
    

    위의 스크립트를 확인 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top