파일이 누락 된 경우 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.