rm이 파일을 찾지 못했다고보고하지 못하게하는 방법은 무엇입니까?


155

rm많은 파일을 삭제하기 위해 BASH 스크립트 내에서 사용 하고 있습니다. 때로는 파일이 존재하지 않으므로 많은 오류를보고합니다. 이 메시지는 필요 없습니다. 나는 rm조용히 하기위한 명령에 대한 매뉴얼 페이지를 검색 했지만, 내가 찾은 유일한 옵션은 -f"존재하지 않는 파일을 무시하고 프롬프트하지 않는다"라는 설명에서 올바른 선택 인 것 같지만 이름이 맞지 않는 것 같다 따라서 의도하지 않은 결과가 발생할 수 있습니다.

  • 는 IS -f옵션은 침묵하는 올바른 방법 rm? 왜 전화하지 -q않습니까?
  • 이 옵션이 다른 작업을 수행합니까?

4
-f를 사용하지 않으려면 읽기 전용으로 표시된 파일을 제거합니다.
피자

답변:


209

주요 용도는 자체적으로 -f사용하여 제거되지 않는 파일을 강제로 제거하는 것 rm입니다 (특별한 경우 존재하지 않는 파일을 "제거"하여 오류 메시지를 억제 함).

당신은 또한 사용하여 오류 메시지를 리디렉션 할 수 있습니다

$ rm file.txt 2> /dev/null

(또는 운영 체제와 동등한 기능). 파일이 실제로 제거되었는지 여부를 확인하기 위해 $? 호출 한 직후 의 값을 확인할 수 있습니다 rm.


3
--fGNU Coreutils에는 유효 rm하지만, 고유 약어로만 사용되기 때문입니다 --force. 짧은 형태 -f는 더 명확하고 휴대가 편리합니다.
Keith Thompson

나는 심지어 그것을 깨달았다. --f여기에 오타가 -f있습니다.
chepner

2
2의 기능 2>은 무엇입니까?
Dan

@Maverick stderr로 보낸 모든 메시지를 터미널로 보내는 대신 / dev / null로 리디렉션합니다.
Benjamin Nolan

73

예, -f가장 적합한 옵션입니다.


일부 시스템은 백 슬래시를 사용할 때까지 -f를 사용하여 공간이있을 때 프롬프트를 표시합니다.
vimdude

11
@vimdude : "일부 시스템"이 아닙니다. 그 동작은 매핑 쉘 기능 또는 별칭이 있음을 나타냅니다 rm로를 rm -i.
Keith Thompson

28

-f는 올바른 플래그이지만 테스트 운영자에게는 rm이 아닙니다.

[ -f "$THEFILE" ] && rm "$THEFILE"

이것은 파일이 존재하고 일반 파일 (디렉토리, 장치 노드 등이 아님)임을 확인합니다.


4
그러나 경쟁 조건이 있으므로 프로덕션 스크립트에서 사용해서는 안됩니다.
tripleee

@tripleee가 지적한 것은 "-f"테스트와 파일 제거가 어떤 순서로든 완료 될 수 있다고 생각합니다. 또 다른 방법 if [ -f "$THEFILE" ]; then rm "$THEFILE"; fi은 테스트와 파일 제거 단계를 명시 적으로 순차적으로 만드는 것입니다.
robla

2
@robla 그 코드는 더 자세한 구문으로 동일한 정확한 일을 수행합니다 ... &&! = & ... 테스트는 항상 rm 전에 발생하지만 별도의 프로세스는 기술적으로 (매우 가능성은 낮지 만) rm이 실행되기 전에 (쉘 동안) 삭제할 수 있습니다 테스트 후 코드를 해석합니다).
technosaurus

technosaurus-아, 맞아. @mmlac의 질문에 가장 적합한 답변은 무엇이라고 생각하십니까?
robla

3
그리고 단지 확인을 위해, 경쟁 조건은 무엇인가 사이에 파일을 제거 할 수 있다는 것입니다 testrm. 여기 rm전에는 실행할 수있는 방법이 없습니다 test. 동시 프로그래밍에서 일반적인 실수는 도약하기 전에 실제로 "도약"할 때 "모양"결과를 더 이상 신뢰할 수 없다는 것입니다. 이에 대한 해결책은 잠금 또는 원자 연산을 사용하는 것입니다. 정확히 원하는 이유 rm -f는 후자의 예입니다.
tripleee 2019 년

13

\rm -f file 보고하지 않습니다.


4
-r은 불필요하고 위험합니다.
mahemoff 2016 년

1
많은 파일이나 디렉토리를 가정했습니다. 사용자의 요청을 다시 읽으면 파일 만 요청하는 것이 맞습니다. 그래서 내 대답을 수정
vimdude

RM이하기 전에 백 슬래시는 무엇입니까? 제발 대답이 필요합니다. Windows에서 cygwin의 make 버전 4.1은 \ rm을 처리 할 수없고 3.75는 정상적으로 작동합니다.
Ayman Salah

2
@AymanSalah이 문맥에서 백 슬래시는 실제 함수를 감싸는 모든 함수 또는 별칭을 피할 수 있습니다 rm(1990 년대 초 일부 사이트에서 초보자가 물건을 제거하고 파일을 다시 가져 오기 위해 sysadmin을 호출하는 것을 방지하기 위해 일부 사이트에서 널리 사용됨 ).
tripleee 2019 년

감사합니다-이것은 내 문제를 해결했습니다. 분명히 종료 코드는 &&-f없이 while을 사용하여 연결을 허용 하므로 파일을 찾지 못하면 끊어집니다.
Igor

5

지금까지로 rm -f"무엇"을하고, 그것은 힘을 (수행 -f속기입니다 --force상황에서 침묵 제거) rm, 그렇지 않으면 확인을 요청할 것입니다. 예를 들어, 쓰기 가능한 디렉토리에서 사용자가 쓸 수없는 파일을 제거하려고 할 때.


-9

cshell에 대해 동일한 문제가있었습니다. 내가 가진 유일한 해결책은 내 스크립트에서 "rm"이전의 패턴과 일치하는 더미 파일을 만드는 것입니다.


7
이것이 유일한 해결책 이었습니까? 당신은 시도 했 rm -frm filename >&/dev/null?
Keith Thompson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.