[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
당신은 예 또는 아니오 볼 수 있도록를, 리디렉션 stdout
및 stderr
에 /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">