다양한 디렉터리에서 파일을 삭제하려는 bash 스크립트가 있습니다. 일반적으로 생성되지 않았기 때문에 존재하지 않지만 괜찮습니다. 스크립트가 해당 오류를 보고하지 않도록 하는 방법이 있습니까? 하지만 rm에 오류를 보고하는 다른 출력이 있는 경우?
또는 소음이 적은 파일을 삭제하는 더 나은 명령이 있습니까?
답변1
이 -f
옵션을 사용하세요. 존재하지 않는 파일은 자동으로 무시됩니다.
에서 man rm
:
-f, --force
ignore nonexistent files and arguments, never prompt
["메시지를 표시하지 않음" 부분은 (a) -f
이전에 지정한 옵션 -i
이나 -I
옵션을 덮어쓰고 (b) 쓰기 금지된 파일을 묻지 않고 삭제한다는 의미입니다. ]
예
그렇지 않은 경우 -f
파일 rm
누락에 대해 불평합니다.
$ rm nonesuch
rm: cannot remove ‘nonesuch’: No such file or directory
을 사용하면 -f
자동으로 유지됩니다.
$ rm -f nonesuch
$
답변2
귀하의 요구 사항이 rm
누락된 파일에 대해 불평하는 것이 아니라 모든 파일을 원하는 경우다른출력의 rm
경우 먼저 대상 파일이 존재하는지 테스트한 다음 rm
(아니요플래그 -f
) 파일이 존재하는 경우.
# rest of script
# ...
[ -e "$file" ] && rm "$file"
# ...
# rest of script
예를 들어 rm -f
사용자 쓰기 권한 없이 파일을 호출하면 파일이 삭제됩니다.그리고이 시나리오에 대한 일반 프롬프트도 표시되지 않습니다.
여러 파일에 동일한 아이디어를 사용하려면 다음과 같은 함수 정의를 만듭니다.
qrm() {
for f
do
[ -e "$f" ] && rm "$f"
done
}
다음과 같이 사용하세요:qrm file1 file2-does-not-exist *.txt etc here
답변3
rm
명령을 실행할 때 명령의 추가 출력을 계속 보고 싶다고 표시 하지만 이 -f
옵션을 사용하면 해당 출력이 표시되지 않습니다. 원하는 것을 얻으려면 STDERR를 필터링해야 하는데, 다른 모든 항목이 표시되기를 원하기 때문에 이는 약간 까다롭습니다.
다음과 같은 명령을 사용해야 합니다.
rm -f filename 3>&1 1>&2 2>&3 3>&- | grep -v 'No such file or directory'
명령 설명:
-f
확인이나 오류 메시지 없이 매개변수가 강제로 적용됩니다.3>&1 1>&2 2>&3 3>&-
필터링을 위해 STDOUT 및 STDERR을 전환하는 것입니다(이에 대해 자세히 읽을 수 있습니다).여기네가 원한다면| grep -v 'No such file or directory'
보고 싶지 않은 메시지 필터링
이제 오류 메시지를 완전히 표시하지 않으려면 다음 명령을 실행할 수 있습니다.
rm filename 2> /dev/null
이 명령은 STDERR을 /dev/null로 리디렉션하므로 명령을 실행할 때 이를 볼 수 없습니다.
답변4
find
대안으로 옵션 과 함께 명령을 사용할 수 있습니다 -delete
. 이것은 (분명히) 찾은 파일만 삭제하므로 그렇지 않은 경우 경고가 발생하지 않습니다. 예를 들면 다음과 같습니다.
find /var/log/triffids/ -name "*.log" -mtime 30 -delete
디렉토리가 검색되고 30일 이상 수정되지 않은 접미사가 포함된 /var/log/triffids/
모든 파일이 삭제됩니다..log
항상 이러한 명령을 실행하는 것이 좋습니다.아니요-delete
원하는 파일을 찾으려면 먼저 이 옵션을 선택하십시오 .