파일이 존재하지 않는 경우 rm이 오류를 발생시키지 않게하려면 어떻게합니까?


329

컴파일이 끝나면 쓸모없는 파일을 정리하는 makefile을 작성 중입니다. 대상이 이미 작성된 경우 해당 대상을 건너 뛰고 쓸모없는 파일이 없을 수 있습니다. 그래서 내가 이것을하면 :

rm lexer.ml interpparse.ml interpparse.mli

파일 중 하나가 존재하지 않기 때문에 오류가 발생할 수 있습니다. rm이 파일들을 무시 하도록 지시 할 방법 이 있습니까?

매뉴얼 페이지를 읽으면 다음 옵션이 나타납니다.

 -f          Attempt to remove the files without prompting for confirma-
             tion, regardless of the file's permissions.  If the file does
             not exist, do not display a diagnostic message or modify the
             exit status to reflect an error.  The -f option overrides any
             previous -i options.

즉 같은 소리 거의 내가 원하는,하지만 권한 부분에 대해 정말 모르겠어요. 이것을 할 수있는 방법이 있습니까?


rm샌드 박스에서 사용해 보셨습니까 ? 글 -f로빙에 관계없이 원하는 것을 정확하게하는 것처럼 보입니다 .
JMD

권한이 허용되지 않는 경우 rm은 -f옵션 을 사용하여 여전히 삭제를 시도합니다. 실패합니다. 실패했다고는 말하지 않습니다. 파일 이름이 변수이거나 glob 인 경우에 유용합니다.
LawrenceC

완전성을 위해 : 오류 종료 상태를 반환하는 것을 제외하고 는 rm --interactive=never어떤 동작이 rm -f있습니다. 자세한 내용은 여기를 참조하십시오 : unix.stackexchange.com/questions/72864/…
lesmana

답변:


282

-f옵션을 사용하는 것으로 원하는 것을 확실히이다.

파일 권한에 대한 확인은 다음과 같습니다.

$ touch myfile    
$ chmod 400 myfile
$ rm myfile       
rm: remove write-protected regular empty file `myfile'?

그래서 rm당신은 당신이에 쓰기 권한이없는 파일을 삭제하려고하면 경고합니다. 디렉토리에 대한 쓰기 권한이 있지만 약간 이상한 경우 허용됩니다. 따라서 rm일반적으로 디렉토리 에 대해 경고합니다.


1
대부분의 시스템이 요구하는 것은 아닙니다 (제 생각에). 일부는 필요합니다 -i.
DaveParillo

1
오류 종료 코드가 아닌 오류 메시지를 원하는 경우 Giel Berkers 의 답변을 참조하십시오 . set -e모든 bash 스크립트에서 사용 하므로 명령이 오류를 일으킨 후에 스크립트가 종료됩니다. 종종 rm오류가 발생 했는지 알려주는 스크립트가 필요 하지만 계속 진행하십시오. 계속합니다.
cledoux

124

또 다른 해결책은 다음과 같습니다 .https : //stackoverflow.com/questions/11231937/bash-ignoring-error-for-a-particular-command

명령 후에 OR 문을 추가하십시오.

rm -rf my/dir || true

이런 식으로 명령문 # 1이 실패하면 (오류가 발생) 명령문 # 2를 실행하십시오 true.


4
오류를 인쇄하고 내 경우에 원하는 실행을 계속합니다.
worldsayshi

9
또는 rm -rf my/dir ||:더 간결하게 :하기 위해 ( 약칭 true)
Godsmith

내 의견으로는 더 나은 해결책. 무슨 일이 일어나고 있고 결과 코드가 왜 무시되는지 쉽게 알 수 있습니다. 나는 그것을 좋아한다!
Mavamaarten

76

나는 파티에 늦었지만 항상 이것을 사용합니다. makefile에서 -행의 시작에 추가 하여 해당 행의 리턴 값을 무시하십시오. 이렇게 :

-rm lexer.ml interpparse.ml interpparse.mli

9
그래도 여전히 콘솔에 오류를 인쇄하여 make 출력의 오류를 무시하도록 훈련시킵니다. 내 의견으로는 rm -rf가 더 나은 옵션입니다.
Godsmith

@Godsmith 재귀 삭제를 강제하는 것보다 오류를 무시하고 싶습니다. 이것은 매우 나쁜 것일 수 있습니다. 메이크 파일 고유 구문의 경우 +1
Daishi

rm -rf가 "naughty"일 수있는 경우 버전 제어 하의 디렉토리 외부에서 make를 사용하고 있음을 의미합니다. 왜?
Godsmith

설명서에 대한 링크를 제공하십시오. 이 기능에 대한 설명을 찾을 수 있습니다.
George Sovetov

@GeorgeSovetov gnu.org/software/make/manual/make.html# 오류
Robert Li

14

-f 옵션을 사용하지 않으려면 대안은 다음과 같습니다.

rm filethatdoesntexist 2> /dev/null 

이렇게하면 오류가 인쇄되지 않습니다.


9
불행히도 이것은 여전히 ​​오류 종료 코드를 제공합니다.
숀 맥도날드

8

당신이 할 수있는 방법 찾을 경우 glob에 파일 이름을, rm일치하는 항목을 찾을 수없는 경우 불평하지 않습니다. 따라서 lexer.m* interpparse.*등의 것이 효과가 있습니다 (물론 너무 많이 삭제하지 않도록주의하십시오). 또한 -f파일 권한으로 원하지 않는 파일을 삭제하지 않기를 원한다면 완벽하게 합리적인 방법입니다. 삭제하고 싶지 않으면 넣지 마십시오. 목록에서.


삭제하고 싶지 않은 lexer.mll 파일이 있으므로 글 로빙은 문제가되지 않습니다. -f가 합리적인 이유를 보여 주셔서 감사합니다. 나는 너무 많은 잘못 인도 된 후에 지나치게 조심하는 경향이 있다고 생각 sudo rm -rf합니다.
Jason Baker

더 제한적이지 않은 lexer.m?...? 즉 잡을 것 lexer.ml하고 lexer.mz있지만, lexer.mlllexer.mla.
JMD

1
@ JMD : 쉘에 따라 다르며 globbing에 어떤 패턴 일치 지원을 제공한다고 가정합니다.
Nick Bastin 2018

6

-f 옵션은 예상과 다른 경우 프롬프트가 표시되지 않음을 의미합니다. 권한이 고려되지는 않습니다.

파일을 제거 할 권한이 충분하지 않으면 제거되지 않습니다.

그러나 권한을 변경하기에 충분한 권한이 있으면 파일이 제거됩니다. 소유자 (-r --------)에 대한 읽기 전용 권한이있는 파일의 소유자 인 경우입니다. 소유자는 chmod u+w다음을 수행 한 다음 제거 할 수 있습니다 rm -f. 해당 파일이 제거됩니다.


5

어쩌면 다음과 비슷한 줄을 도울 수 있습니다.

touch fakefile.exe fakefile.o && rm *.o *.exe

나는 이것이 똑똑하지 않다는 것을 알고 있지만 일을합니다.


3

대안:

RmIfIsFile() {  for f in "$@"; do [ -f $f ] && rm $f; done; };  RmIfIsFile lexer.ml interpparse.ml interpparse.mli

너무 나쁜 Makefile은 여러 줄에서 쉘 함수 정의를 공유 할 수 없습니다.


행 끝에 \ (백 슬래시)를 사용하여 다음 행을 계속하려고 했습니까?
일부

@ some : 예, 여러 줄로 퍼질 수 있지만 레시피에서 공유하려면 make 변수에 정의를 넣어야합니다.
reinierpost

3

다음은 쉘 스크립트에서 사용하는 것입니다. 오류 메시지와 오류 코드를 숨 깁니다.

rm doesnotexist 2> /dev/null || echo > /dev/null

어떻 rm doesnotexist 2&> /dev/null
습니까

1

파일을 등록하기 전에 파일을 터치 할 수 있습니다. 그들이 존재하지 않으면 그것들을 만들 것입니다 :-)

touch lexer.ml interpparse.ml interpparse.mli
rm lexer.ml interpparse.ml interpparse.mli

1

쓰기 rm -rf ppp>/dev/null 2>&1 오류가 2 만 STDOUT 1 stderr로하지 생성 할 경우 새로운 GET 오류 메시지 문제가 발생 ...이 명령은 오류 만 경고하지 생성 할 때 일어날입니다. 필터를 설정하고이 메시지를 제거해야합니다. 그러나이 경우는 일반적입니다.


1

파일이 먼저 존재하는지 확인한 다음 파일이 있으면 rm으로 전달하십시오. 그러면 rm의 오류가 의미가 있습니다. -f 또는 오류 메시지를 무시하는 것은 일반적으로 사람이 원하는 것보다 더 포괄적입니다. -f 원하지 않는 일을 할 수도 있습니다.

if [ -f lexer.ml ]; then
  rm lexer.ml
fi

더 많은 파일이 존재하면 더 많은 테스트 절을 추가하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.