질문자 :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이를 수행하는 세 가지 방법이 있습니다.
bash를 사용하여 종료 상태를 무효화합니다(다른 답변에서는 이에 대해 언급하지 않음).
if ! [ -e "$file" ]; then echo "file does not exist" fi
또는:
! [ -e "$file" ] && echo "file does not exist"
테스트 명령 내에서 테스트를 무효화하십시오 [
(이것이 대부분의 답변이 이전에 제시한 방식입니다):
if [ ! -e "$file" ]; then echo "file does not exist" fi
또는:
[ ! -e "$file" ] && echo "file does not exist"
(시험되는 부정적인 결과에 관한 법률 ||
대신 &&
) :
오직:
[ -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!"
user2350426test
도 셀 수 있습니다. 그것은 나를 위해 일했습니다 ( 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에서만 작동합니다.
upteryxenvfile=.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