[shell] 쉘 스크립트에 파일이 있는지 확인하는 방법

특정 파일 ()이 있는지 확인 archived_sensor_data.json하고 있으면 삭제 하는 쉘 스크립트를 작성하고 싶습니다 . http://www.cyberciti.biz/tips/find-out-if-file-exists-with-conditional-expressions.html 에 따라 다음을 시도했습니다.

[-e archived_sensor_data.json] && rm archived_sensor_data.json

그러나 이것은 오류가 발생합니다

[-e: command not found

명령을 test_controller사용하여 결과 스크립트 를 실행하려고 할 때 ./test_controller. 코드에 어떤 문제가 있습니까?



답변

대괄호와 -e: 사이에 필요한 공간이 없습니다 .

#!/bin/bash
if [ -e x.txt ]
then
    echo "ok"
else
    echo "nok"
fi


답변

다음을 사용하는 대체 방법이 있습니다 ls.

(ls x.txt && echo yes) || echo no

당신의 모든 출력 숨기려면 ls당신은 예 또는 아니오 볼 수 있도록를, 리디렉션 stdoutstderr/dev/null:

(ls x.txt >> /dev/null 2>&1 && echo yes) || echo no


답변

내 솔루션 권장 사항의 배경은 첫 번째 작업의 두 번째 주에 빌드 서버 청소의 절반을 닦은 친구의 이야기입니다. 기본 작업은 파일이 존재하는지 확인하고 존재하는 경우 삭제하는 것입니다. 그러나이 강에는 몇 가지 위험한 급류가 있습니다.

  • 모든 것이 파일입니다.

  • 스크립트는 일반적인 작업을 해결할 때만 강력한 힘을 발휘합니다

  • 일반적으로 변수를 사용합니다

  • 우리는 종종 수동 개입을 피하기 위해 스크립트에서 -f force를 사용합니다.

  • 또한 적시에 우리가 만들고, 복사하고, 파괴 할 수 있도록 재귀를 사랑합니다.

다음 시나리오를 고려하십시오.

삭제하려는 파일이 있습니다 : filesexists.json

이 파일 이름은 변수에 저장됩니다

<host>:~/Documents/thisfolderexists filevariable="filesexists.json"

우리는 또한 일을 정말 유연하게하기 위해 경로 변수를 가지고 있습니다

<host>:~/Documents/thisfolderexists pathtofile=".."

<host>:~/Documents/thisfolderexists ls $pathtofile

filesexists.json  history20170728  SE-Data-API.pem  thisfolderexists

따라서 -e예상대로 작동하는지 봅시다 . 파일이 존재합니까?

<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?

0

그렇습니다. 마법.

그러나 파일 변수가 실수로 nuffin으로 평가되면 어떻게 될까요?

<host>:~/Documents/thisfolderexists filevariable=""

<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?

0

뭐? 그것은 오류와 함께 반환되어야합니다 … 그리고 이것은 우연히 전체 폴더가 삭제 된 이야기의 시작입니다.

대안은 우리가 ‘파일’로 이해하는 것을 구체적으로 테스트하는 것일 수 있습니다.

<host>:~/Documents/thisfolderexists filevariable="filesexists.json"

<host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?

0

그래서 파일이 존재합니다 …

<host>:~/Documents/thisfolderexists filevariable=""

<host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?

1

그래서 이것은 파일이 아니며 아마도 전체 디렉토리를 삭제하고 싶지 않을 것입니다

man test 다음과 같이 말합니다.

-b FILE

       FILE exists and is block special

-c FILE

       FILE exists and is character special

-d FILE

       FILE exists and is a directory

-e FILE

       FILE exists

-f FILE

       FILE exists and is a regular file

...

-h FILE

       FILE exists and is a symbolic link (same as -L)


답변

내부적으로 rm 명령은 파일 존재를 테스트해야하는데
왜 다른 테스트를 추가해야합니까? 그냥 발행

rm filename

그것이 있든 없든 그 후에 사라질 것입니다.
rm -f를 사용하면 존재하지 않는 파일에 대한 메시지를 원하지 않습니다.

파일이 존재하지 않는 경우 조치를 취해야하는 경우 직접 테스트해야합니다. 예제 코드를 기준으로이 경우에는 그렇지 않습니다.


답변

NFS를 사용하는 경우 “테스트”가 더 나은 솔루션입니다. NFS가 다운 된 경우 시간 초과를 추가 할 수 있기 때문입니다.

time timeout 3 test -f
/nfs/my_nfs_is_currently_down
real    0m3.004s <<== timeout is taken into account
user    0m0.001s
sys     0m0.004s
echo $?
124   <= 124 means the timeout has been reached

“[-e my_file]”구문은 NFS가 다시 작동 할 때까지 정지됩니다.

if [ -e /nfs/my_nfs_is_currently_down ]; then echo "ok" else echo "ko" ; fi

<no answer from the system, my session is "frozen">


답변