파일이 손실되면 rm이 보고하지 않나요?

파일이 손실되면 rm이 보고하지 않나요?

다양한 디렉터리에서 파일을 삭제하려는 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원하는 파일을 찾으려면 먼저 이 옵션을 선택하십시오 .

관련 정보