etc./StackOverFlow

Bash에 일반 파일이 없는지 어떻게 알 수 있습니까?

청렴결백한 만능 재주꾼 2021. 10. 7. 22:03
반응형

질문자 :Bill the Lizard


파일이 존재하는지 확인하기 위해 다음 스크립트를 사용했습니다.

 #!/bin/bash FILE=$1 if [ -f $FILE ]; then echo "File $FILE exists." else echo "File $FILE does not exist." fi

파일이 존재 하지 않는지 확인하려는 경우 올바른 구문은 무엇입니까?

 #!/bin/bash FILE=$1 if [ $FILE does not exist ]; then echo "File $FILE does not exist." fi


테스트 명령( [ 여기 )에는 느낌표인 "not" 논리 연산자가 있습니다(다른 많은 언어와 유사). 이 시도:

 if [ ! -f /tmp/foo.txt ]; then echo "File not found!" fi

John Feminella

배시 파일 테스트

-b filename - 특수 파일 차단
-c filename - 특수 문자 파일
-d directoryname - 디렉토리 존재 여부 확인
-e filename - 유형(노드, 디렉토리, 소켓 등)에 관계없이 파일 존재를 확인합니다.
-f filename - 디렉토리가 아닌 일반 파일 존재 여부 확인
-G filename - 파일이 존재하고 유효한 그룹 ID가 소유하고 있는지 확인
-G filename set-group-id - 파일이 존재하고 set-group-id이면 참
-k filename - 고정 비트
-L filename - 심볼릭 링크
-O filename - 파일이 존재하고 유효 사용자 ID가 소유한 경우 참
-r filename - 파일이 읽을 수 있는지 확인
-S filename - 파일이 소켓인지 확인
-s filename - 파일 크기가 0이 아닌지 확인
-u filename - 파일 set-user-id 비트가 설정되어 있는지 확인
-w filename - 파일이 쓰기 가능한지 확인
-x filename - 파일이 실행 가능한지 확인

사용하는 방법:

 #!/bin/bash file=./file if [ -e "$file" ]; then echo "File exists" else echo "File does not exist" fi

테스트 표현식! 운영자

 #!/bin/bash file=./file if [ ! -e "$file" ]; then echo "File does not exist" else echo "File exists" fi

BlueCacti

"!"로 표현식을 부정할 수 있습니다.

 #!/bin/bash FILE=$1 if [ ! -f "$FILE" ] then echo "File $FILE does not exist" fi

관련 매뉴얼 페이지는 man test 또는 동등하게 man [ -- 또는 내장 bash 명령에 대한 help test 또는 help [


unbeknown

[[ -f $FILE ]] || printf '%s does not exist!\n' "$FILE"

또한 파일이 깨진 심볼릭 링크이거나 소켓, 장치 또는 fifo와 같은 비정규 파일일 수도 있습니다. 예를 들어, 깨진 심볼릭 링크에 대한 검사를 추가하려면:

 if [[ ! -f $FILE ]]; then if [[ -L $FILE ]]; then printf '%s is a broken symlink!\n' "$FILE" else printf '%s does not exist!\n' "$FILE" fi fi

guns

단일 명령을 실행해야 하는 경우 축약할 수 있다는 점을 언급할 가치가 있습니다.

 if [ ! -f "$file" ]; then echo "$file" fi

에게

 test -f "$file" || echo "$file"

또는

 [ -f "$file" ] || echo "$file"

Elazar Leibovich

나는 POSIX 셸 호환 형식으로 다음 한 줄짜리를 선호합니다.

 $ [ -f "/$DIR/$FILE" ] || echo "$FILE NOT FOUND" $ [ -f "/$DIR/$FILE" ] && echo "$FILE FOUND"

스크립트에서 수행하는 것처럼 몇 가지 명령의 경우:

 $ [ -f "/$DIR/$FILE" ] || { echo "$FILE NOT FOUND" ; exit 1 ;}

일단 이 작업을 시작하면 더 이상 완전한 형식의 구문을 거의 사용하지 않습니다!!


J. M. Becker

파일 존재를 테스트하기 위해 매개변수는 다음 중 하나일 수 있습니다.

 -e: Returns true if file exists (regular file, directory, or symlink) -f: Returns true if file exists and is a regular file -d: Returns true if file exists and is a directory -h: Returns true if file exists and is a symlink

아래의 모든 테스트는 일반 파일, 디렉토리 및 심볼릭 링크에 적용됩니다.

 -r: Returns true if file exists and is readable -w: Returns true if file exists and is writable -x: Returns true if file exists and is executable -s: Returns true if file exists and has a size > 0

예제 스크립트:

 #!/bin/bash FILE=$1 if [ -f "$FILE" ]; then echo "File $FILE exists" else echo "File $FILE does not exist" fi

SD.

다음과 같이 할 수 있습니다.

 [[ ! -f "$FILE" ]] && echo "File doesn't exist"

또는

 if [[ ! -f "$FILE" ]]; then echo "File doesn't exist" fi

파일과 폴더를 모두 확인하려면 -f 대신 -e 옵션을 사용하십시오. -e 는 일반 파일, 디렉토리, 소켓, 문자 특수 파일, 블록 특수 파일 등에 대해 true를 반환합니다.


Jahid

예기치 않은 결과가 발생할 수 있으므로 인용되지 않은 변수에 대한 test 를 실행할 때 주의해야 합니다.

 $ [ -f ] $ echo $? 0 $ [ -f "" ] $ echo $? 1

일반적으로 테스트된 변수를 큰따옴표로 묶는 것이 좋습니다.

 #!/bin/sh FILE=$1 if [ ! -f "$FILE" ] then echo "File $FILE does not exist." fi

artdanil

 [ -f "$file" ]

[ 명령은 $file stat() ( lstat() ) 시스템 호출을 수행하고 해당 시스템 호출이 성공하고 stat() 의해 반환된 파일 형식이 " 일반 " 이면 true를 반환합니다.

따라서 [ -f "$file" ] 이 true를 반환하면 파일이 존재하고 일반 파일 또는 결국 일반 파일로 확인되는 심볼릭 링크(또는 적어도 stat() 시점에 있었던 것)임을 알 수 있습니다.

그러나 false를 반환하는 경우(또는 [ ! -f "$file" ] 또는 ! [ -f "$file" ] true를 반환하는 경우) 다양한 가능성이 있습니다.

  • 파일이 존재하지 않습니다
  • 파일이 존재하지만 일반 파일이 아닙니다(장치, fifo, 디렉토리, 소켓...).
  • 파일이 존재하지만 상위 디렉토리에 대한 검색 권한이 없습니다.
  • 파일이 존재하지만 액세스할 수 있는 경로가 너무 깁니다.
  • 파일은 일반 파일에 대한 심볼릭 링크이지만 심볼릭 링크 해석과 관련된 일부 디렉토리에 대한 검색 권한이 없습니다.
  • stat() 시스템 호출이 실패할 수 있는 다른 이유.

간단히 말해서 다음과 같아야 합니다.

 if [ -f "$file" ]; then printf '"%s" is a path to a regular file or symlink to regular file\n' "$file" elif [ -e "$file" ]; then printf '"%s" exists but is not a regular file\n' "$file" elif [ -L "$file" ]; then printf '"%s" exists, is a symlink but I cannot tell if it eventually resolves to an actual file, regular or not\n' "$file" else printf 'I cannot tell if "%s" exists, let alone whether it is a regular file or not\n' "$file" fi

파일이 존재하지 않는다는 것을 확실히 알기 위해서는 ENOENT 의 오류 코드를 반환하기 위해 stat() 시스템 호출이 필요합니다( ENOTDIR 는 경로 구성 요소 중 하나가 디렉토리가 아니라고 알려줍니다. 파일이 해당 경로에 존재하지 않음). 불행히도 [ 명령은 그것을 알려주지 않습니다. 오류 코드가 ENOENT, EACCESS(권한 거부됨), ENAMETOOLONG 또는 기타 여부에 관계없이 false를 반환합니다.

[ -e "$file" ] ls -Ld -- "$file" > /dev/null 수행할 수 있습니다. 이 경우 정보를 프로그래밍 방식으로 쉽게 사용할 수 없지만 ls stat() 실패한 이유를 알려줍니다.

 $ file=/var/spool/cron/crontabs/root $ if [ ! -e "$file" ]; then echo does not exist; fi does not exist $ if ! ls -Ld -- "$file" > /dev/null; then echo stat failed; fi ls: cannot access '/var/spool/cron/crontabs/root': Permission denied stat failed

적어도 ls 는 파일이 존재하지 않기 때문에 실패한 것이 아니라고 알려줍니다. 파일의 존재 여부를 알 수 없기 때문입니다. [ 명령은 문제를 무시했습니다.

zsh 쉘을 사용하면 [ $ERRNO 특수 변수를 사용하여 오류 코드를 쿼리 zsh/system 모듈 $errnos 특수 배열을 사용하여 해당 번호를 디코딩할 수 있습니다.

 zmodload zsh/system ERRNO=0 if [ ! -f "$file" ]; then err=$ERRNO case $errnos[err] in ("") echo exists, not a regular file;; (ENOENT|ENOTDIR) if [ -L "$file" ]; then echo broken link else echo does not exist fi;; (*) syserror -p "can't tell: " "$err" esac fi

(최신 버전의 gcc 빌드할 때 일부 버전의 zsh $errnos 지원이 중단되었음을 주의하십시오).


Stephane Chazelas

이를 수행하는 세 가지 방법이 있습니다.

  1. bash를 사용하여 종료 상태를 무효화합니다(다른 답변에서는 이에 대해 언급하지 않음).

     if ! [ -e "$file" ]; then echo "file does not exist" fi

    또는:

     ! [ -e "$file" ] && echo "file does not exist"
  2. 테스트 명령 내에서 테스트를 무효화하십시오 [ (이것이 대부분의 답변이 이전에 제시한 방식입니다):

     if [ ! -e "$file" ]; then echo "file does not exist" fi

    또는:

     [ ! -e "$file" ] && echo "file does not exist"
  3. (시험되는 부정적인 결과에 관한 법률 || 대신 && ) :

    오직:

     [ -e "$file" ] || echo "file does not exist"

    이것은 어리석은 것처럼 보입니다(IMO). 코드가 파이프라인 부정 연산자( ! ) /bin/sh 와 같은)으로 이식되어야 하는 경우가 아니면 사용하지 마십시오.

     if [ -e "$file" ]; then : else echo "file does not exist" fi

user2350426

테스트를 되돌리려면 "!"를 사용하십시오. 이는 다른 언어의 "not" 논리 연산자와 동일합니다. 이 시도:

 if [ ! -f /tmp/foo.txt ]; then echo "File not found!" fi

또는 약간 다른 방식으로 작성되었습니다.

 if [ ! -f /tmp/foo.txt ] then echo "File not found!" fi

또는 다음을 사용할 수 있습니다.

 if ! [ -f /tmp/foo.txt ] then echo "File not found!" fi

또는 모두 함께 누르기:

 if ! [ -f /tmp/foo.txt ]; then echo "File not found!"; fi

다음과 같이 쓸 수 있습니다("and" 연산자: && 사용).

 [ ! -f /tmp/foo.txt ] && echo "File not found!"

다음과 같이 더 짧아 보입니다.

 [ -f /tmp/foo.txt ] || echo "File not found!"

user2350426

test 도 셀 수 있습니다. 그것은 나를 위해 일했습니다 ( Bash Shell 기반: Check File Exists or Not ):

 test -e FILENAME && echo "File exists" || echo "File doesn't exist"

android developer

이 코드도 작동합니다.

 #!/bin/bash FILE=$1 if [ -f $FILE ]; then echo "File '$FILE' Exists" else echo "The File '$FILE' Does Not Exist" fi

Lemon Kazi

가장 간단한 방법

 FILE=$1 [ ! -e "${FILE}" ] && echo "does not exist" || echo "exists"

lancerex

이 쉘 스크립트는 디렉토리에서 파일을 찾는 데도 작동합니다.

 echo "enter file" read -ra if [ -s /home/trainee02/"$a" ] then echo "yes. file is there." else echo "sorry. file is not there." fi

Simmant

때로는 && 및 ||를 사용하는 것이 편리할 수 있습니다. 운영자.

(명령 "test"가 있는 경우)에서와 같이:

 test -b $FILE && echo File not there!

또는

 test -b $FILE || echo File there!

André

[] 대신 test 를 사용하려면 ! 부정을 얻으려면:

 if ! test "$FILE"; then echo "does not exist" fi

Mauro Zallocco

하나의 라이너에서 여러 명령을 그룹화할 수도 있습니다.

[ -f "filename" ] || ( echo test1 && echo test2 && echo test3 )

또는

[ -f "filename" ] || { echo test1 && echo test2 && echo test3 ;}

파일 이름이 종료되지 않으면 출력은 다음과 같습니다.

 test1 test2 test3

참고: ( ... )는 서브쉘에서 실행되고 { ... ;}는 동일한 쉘에서 실행됩니다. 중괄호 표기법은 bash에서만 작동합니다.


upteryx

envfile=.env if [ ! -f "$envfile" ] then echo "$envfile does not exist" exit 1 fi

kta

출처 : http:www.stackoverflow.com/questions/638975/how-do-i-tell-if-a-regular-file-does-not-exist-in-bash

반응형