특정 파일이 존재하면 임의의 메시지를 표시하는 명령


11

특정 파일이 존재하면“예”메시지를 표시하는 명령이 있습니까? 파일이 존재하지 않으면 기능을 제공 할 필요가 없습니다.

답변:


25

이 간단한 Bash 원 라이너를 사용하십시오.

if [ -e FILENAME ] ; then echo Yes ; fi

-e경우 true로 확인 평가하여이 FILENAME존재, 아니 그것이 무엇인지는 중요하지 않습니다 (파일, 디렉토리, 링크, 장치, ...).

일반 파일 만 확인하려면 @Arronical-f 과 같이 대신 사용하십시오 .


18
[ -e FILENAME ] && echo Yes
Zeb McCorkle 2016 년

@ZebMcCorkle 올바로 작동합니다. 별도의 답변으로 게시 할 수 있습니다.
바이트 사령관

3
경우 FILENAME변수 확장, 또는 특수 문자가 포함되어, 다음을 인용하는 것을 잊지 마세요. 예를 들어 스크립트에서 [ -e "$1" ] && echo Yes.
Peter Cordes

당신이 떠들썩한 파티를 사용하는 경우 @PeterCordes 당신이 사용할 수 [[하고 ]]대신 변수를 인용의.
Holloway

1
@Holloway : yup, 때로는 POSIX sh 만 필요한 이식 가능한 스크립트를 작성해야합니다. 그렇기 때문에이 버전을 내리고 bash 답변을 올리는 대신 안전한 버전을 제공했습니다. 또한 내부 확장을 인용하는 것은 문제가되지 않습니다. [[ ]]항상 인용은 [[ ]]연산자 내부 또는 산술 컨텍스트에 대한 특별한 규칙을 기억하지 못하는 초보자에게는 좋은 습관입니다 .
Peter Cordes

10

이 간단한 스크립트를 사용할 수 있습니다 :

#!/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

2
좋습니다. 그러나 변수 참조를 인용해야합니다 "$1". 공백이 있으면 따옴표없이 끊어지고 다른 나쁜 일이 발생할 수 있습니다.
Joe

9

명령 행의 bash 쉘에서.

if [[ -f /path/to/file ]]; then echo "Yes"; fi

이것은 bash 조건 연산자를 사용하고 -f파일이 존재하고 일반 파일인지 확인합니다. 디렉토리 및 링크를 포함한 모든 파일을 테스트하려면을 사용하십시오 -e.

이것은 bash 조건부에 대한 훌륭한 리소스입니다.


1
왜 이중 괄호?
바이트 커맨더

1
나는 test원래 형식의 팬이 아니며, 그것이 과도하다는 것을 알고 있지만 내 습관입니다.
Arronical

7
@ByteCommander : 이중 중괄호는 일반적으로 단일 중괄호보다 낫습니다. 이들은 [일반적으로 내장 을 호출하는 명령 을 호출하는 대신 쉘 구문의 일부입니다 . 단일 괄호 버전의 불일치 및 벙어리 동작을 수정합니다. [내장은 호환성을 위해 남아 있지만 새로운 bash 코드에서 사용해야 할 이유가 없습니다. (고대 쉘이나 다른 것에서 실행될 수있는 POSIX 호환 스크립트를 작성해야하는 경우에는 다릅니다.)
Nick Matteo

@kundor : 그러나 대부분의 경우, " [보통 내장이라고 부른다"라는 말은 모호하다. type -a [나를 위해 "shell builtin"을 표시 한 다음 " /usr/bin/[."
wchargin

1
@ wchargin : 나는 당신이 무엇을 얻는 지 이해하지 못합니다. 당신의 type결과는 내가 한 말을 뒷받침하는 것처럼 보입니다.
Nick Matteo

5

원하는 것을 수행하는 가장 짧은 명령은 다음과 같습니다.

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는 동등 [합니다 ].


4

이러한 유형의 질문을 피하려면 여러 가지 방법이 있으며 여기에는 또 다른 방법이 있습니다 : 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 '' "
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.