파일이 누락 된 경우 rm이보고하지 않습니까?


38

다양한 디렉토리에서 파일을 제거하려는 bash 스크립트가 있습니다. 종종 생성되지 않았기 때문에 거기에 없을 것입니다. 스크립트가 해당 오류를보고하지 않도록하는 방법이 있습니까?하지만 rm이보고 할 다른 출력이있는 경우?

또는 덜 시끄러운 파일을 제거하는 데 더 나은 명령이 있습니까?

답변:


65

-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
$

4
오, 나는 제거를 요구하지 않은 새로운 것이 존재하지 않는 것을 무시한다는 것을 깨닫지 못했습니다. 나는 사람을 볼 때 그것을 완전히 건너 뛰었습니다. :-) 고맙습니다. 허용되는대로 답변으로 표시하겠습니다.
— flickerfly

9

귀하의 요구 사항은이 경우 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


1
테스트와 제거 사이에 파일이 삭제되거나 생성되는 경쟁 조건이 발생할 가능성이 매우 적다는 사실을 알고 있어야하지만 쉘 스크립트를 사용하는 일반적인 상황에서는 관련이 없다고 생각합니다. .
— David Z

7

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로 경로 재 지정하므로 명령을 실행할 때 표시되지 않습니다.


1
(AFAICS) stdout으로 출력 rm하지 않고 -vstderr 만 사용 하므로이 경우에는 2>&1 | grep더 일반적으로 유용한 춤 없이도 가능합니다.
— dave_thompson_085

4

대안으로, 옵션 find과 함께 명령을 사용할 수 있습니다 -delete. 이렇게하면 찾은 파일 만 삭제되므로 아무것도 없으면 경고하지 않습니다. 예를 들면 다음과 같습니다.

find /var/log/triffids/ -name "*.log" -mtime 30 -delete

/var/log/triffids/디렉토리를 검색하고 .log30 일 이상 수정되지 않은 접미사가있는 모든 파일을 삭제합니다 .

항상 이러한 명령을 실행하는 것이 좋습니다 없이-delete 확인 당신이 기대하는 파일을 찾는 것 만들기 위해, 첫 번째 옵션을.


나는이 옵션을 좋아하고 변화를 고려할 것이다. 공유해 주셔서 감사합니다.
— flickerfly

3

의 --force( -f) 옵션을 확인하십시오 rm:

-f, --force

존재하지 않는 파일과 인수를 무시하고 프롬프트하지 마십시오.


2

이것은 해킹이지만 항상 touch파일을 제거하려고 할 수 있습니다. 존재하지 않는 경우 작성되므로 rm제거 할 수 있습니다.


나는 성능을 제외하고 이것을 좋아합니다. 존재하지 않는 파일 만 삭제하는 대신 여러 K 파일을 만지는 것이 얼마나 비용이 많이 듭니까?
— Dani_l

0

-f매뉴얼 페이지에 따르면 그대로 사용할 수 있습니다 .

파일의 권한에 관계없이 확인 메시지를 표시하지 않고 파일을 제거하십시오. 파일이 존재하지 않으면 진단 메시지를 표시하지 않거나 오류를 반영하여 종료 상태를 수정하십시오. 또한 -f 옵션은 이전의 모든 -i 옵션보다 우선합니다.

rm -f xyz-directory

아무 것도 묻지 않고 원하는 것을 정확하게 수행합니다.


-1

두 가지 주요 방법이 있습니다. -f 옵션을 추가하면 "존재하지 않음"오류가 표시되지 않고 두 가지 : "명령"대신 "명령어 2> / dev"(대부분의 명령에서 작동)가 표시됩니다. / null ". 여기서"thecommand "는 수행중인 명령입니다.


1
나는 발생할 수있는 다른 오류를 풀고 싶지 않기 때문에 배관을 피하고있었습니다. 나는 그들이 무엇인지 모른다.
— flickerfly
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.