답변:
이 간단한 Bash 원 라이너를 사용하십시오.
if [ -e FILENAME ] ; then echo Yes ; fi
-e경우 true로 확인 평가하여이 FILENAME존재, 아니 그것이 무엇인지는 중요하지 않습니다 (파일, 디렉토리, 링크, 장치, ...).
일반 파일 만 확인하려면 @Arronical-f 과 같이 대신 사용하십시오 .
FILENAME변수 확장, 또는 특수 문자가 포함되어, 다음을 인용하는 것을 잊지 마세요. 예를 들어 스크립트에서 [ -e "$1" ] && echo Yes.
[[하고 ]]대신 변수를 인용의.
[[ ]]항상 인용은 [[ ]]연산자 내부 또는 산술 컨텍스트에 대한 특별한 규칙을 기억하지 못하는 초보자에게는 좋은 습관입니다 .
이 간단한 스크립트를 사용할 수 있습니다 :
#!/bin/bash
if [[ -f $1 ]]; then
echo "Yes"
exit 0
else
exit 1
fi
로 저장하십시오 file-exists.sh. 그런 다음 터미널에을 입력하십시오 chmod +x file-exists.sh.
다음과 같이 사용하십시오. 예를 들어 확인하려는 파일로 ./file-exists.sh FILE바꾸십시오 FILE.
./file-exists.sh file.txt
경우 file.txt존재 Yes터미널에 출력되며, 프로그램은 상태 0 (성공)으로 종료됩니다. 파일이 존재하지 않으면 아무것도 인쇄되지 않고 프로그램은 상태 1 (실패)로 종료됩니다.
왜 내가 exit명령을 포함했는지 궁금하다면 계속 읽으십시오 ...
exit명령?exit정상적인 프로세스 종료를 유발합니다. 이것이 의미하는 바는 기본적으로 스크립트를 중지시키는 것입니다. 호출 한 스크립트의 종료 상태가되는 선택적 (숫자) 매개 변수를 승인합니다.
이 종료 상태는 다른 스크립트가 스크립트를 사용할 수있게 file-exists하며 파일이 존재하는지 여부를 알리는 방법입니다.
이것을 사용하는 간단한 예는 다음과 같습니다 (으로 저장 file-exists-cli.sh) :
#!/bin/bash
echo "Enter a filename and I will tell you if it exists or not: "
read FILE
# Run `file-exists.sh` but discard any output because we don't need it in this example
./file-exists.sh $FILE &>> /dev/null
# #? is a special variable that holds the exit status of the previous command
if [[ $? == 0 ]]; then
echo "$FILE exists"
else
echo "$FILE does not exist"
fi
평소대로 chmod +x file-exists-cli.sh하고 실행하십시오 : ./file-exists-cli.sh. 다음과 같은 것을 보게 될 것입니다 :
파일이 존재합니다 ( exit 0) :
➜ ~ ./file-exists-cli.sh
Enter a filename and I will tell you if it exists or not:
booleans.py
booleans.py exists
파일이 없습니다 ( exit 1) :
➜ ~ ./file-exists-cli.sh
Enter a filename and I will tell you if it exists or not:
asdf
asdf does not exist
"$1". 공백이 있으면 따옴표없이 끊어지고 다른 나쁜 일이 발생할 수 있습니다.
명령 행의 bash 쉘에서.
if [[ -f /path/to/file ]]; then echo "Yes"; fi
이것은 bash 조건 연산자를 사용하고 -f파일이 존재하고 일반 파일인지 확인합니다. 디렉토리 및 링크를 포함한 모든 파일을 테스트하려면을 사용하십시오 -e.
test원래 형식의 팬이 아니며, 그것이 과도하다는 것을 알고 있지만 내 습관입니다.
[일반적으로 내장 을 호출하는 명령 을 호출하는 대신 쉘 구문의 일부입니다 . 단일 괄호 버전의 불일치 및 벙어리 동작을 수정합니다. [내장은 호환성을 위해 남아 있지만 새로운 bash 코드에서 사용해야 할 이유가 없습니다. (고대 쉘이나 다른 것에서 실행될 수있는 POSIX 호환 스크립트를 작성해야하는 경우에는 다릅니다.)
[보통 내장이라고 부른다"라는 말은 모호하다. type -a [나를 위해 "shell builtin"을 표시 한 다음 " /usr/bin/[."
type결과는 내가 한 말을 뒷받침하는 것처럼 보입니다.
원하는 것을 수행하는 가장 짧은 명령은 다음과 같습니다.
test -e FILENAME && echo Yes
test -e주어진 이름이 파일 시스템에 존재하는지 테스트합니다. test -f일반 파일로만 제한 할 수 있습니다 . 자세한 내용 man test을 참조하십시오 .
주어진 조건이 true로 평가되면 test성공적인 종료 상태 를 리턴합니다 (그렇지 않으면 실패 상태를 리턴합니다). &&"이전 명령이 성공 상태로 종료되면 다음 명령을 실행"을 의미하는을 사용하여 두 명령을 결합합니다 . 다음 명령은 단순히 Yes표준 출력에 인쇄합니다 . 대화식 쉘의 경우 터미널에서.
이것은 if문장 의 추가 텍스트 자료를 피하면서 동일한 결과를 제공합니다. 사용 &&(또는 그 반대의 ||단 하나의 명령이 포함될 때 함께 명령을 묶는 것은) 잘 작동합니다. 단일 명령의 종료 상태에 대한 응답으로 단일 명령을 실행하는 것 이상을 수행하려는 경우 if구문 을 사용하면 훨씬 더 읽기 쉽습니다.
다른 답변에서 이미 지적했듯이 동등한 if스타일 구성은 다음과 같습니다.
if test -e FILENAME; then echo Yes; fi
또는 대안 적으로 :
if test -e FILENAME
then
echo Yes
fi
이러한 목적으로 종료 를 요구하는 것을 제외 [하고 test는 동등 [합니다 ].
이러한 유형의 질문을 피하려면 여러 가지 방법이 있으며 여기에는 또 다른 방법이 있습니다 : findcommand with -execflag. 파일 경로 find /etc는 디렉토리를 설정하고 -name FILENAMEfilename (duh!)을 지정 하는 두 부분으로 나눌 수 있습니다 . -maxdepth계속됩니다 find작업 /etc전용 디렉토리 및 하위 디렉토리로 내려하지 않습니다
adminx@L455D:~$ find /etc -maxdepth 1 -name passwd -exec printf "YES\n" \;
YES
adminx@L455D:~$ find /etc -maxdepth 1 -name passwd1 -exec printf "YES\n" \;
adminx@L455D:~$
다른 방법으로 stat:
adminx@L455D:~$ stat /etc/passwd1 &>/dev/null && echo YES
adminx@L455D:~$ stat /etc/passwd &>/dev/null && echo YES
YES
또는 파이썬을 통해 :
>>> import os
>>> if os.stat('/etc/passwd'):
... print 'YES'
...
YES
>>> if os.stat('/etc/passwd1'):
... print 'YES'
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 2] No such file or directory: '/etc/passwd1'
또는 짧은 명령 줄 대안 :
python -c "from os.path import exists; print 'Yes' if exists('/etc/fstab') else '' "
[ -e FILENAME ] && echo Yes