delete없이 find로 파일을 찾을 수없는 경우, -delete를 사용하여 find가 / save / 디렉토리의 파일을 지우는 이유는 무엇입니까?


20

에서 제외하고 현재 디렉토리 트리의 모든 파일을 삭제하고 싶습니다 save. 이 명령을 실행했습니다.

 find . \( -name save -prune \) -o -type f -ls | grep /save/

그리고 그것은 아무것도 찾지 못했습니다. 그러나이 명령을 실행할 때 :

 find . \( -name save -prune \) -o -type f -delete

/ save /에있는 모든 파일이 사라졌습니다. 내가 무엇을 놓치고 있습니까?


4
아야 ... 오늘 뭔가를 배웠습니다 (감사합니다). 그리고 나는 mv save/ ../some/safer/location"일반적인"delete 명령 이전에 간단한 것을 추천합니다 . 이제 파일이있는 파일 시스템에 대해 좋은 "삭제 취소"를 찾으십시오. ^^
Olivier Dulac

3
나의 고통은 당신의 예방입니다.
Otheus

1
당신에게 1000 감사합니다. 코드 (종종?)는 신비한 방식으로 작동합니다.
Olivier Dulac


@ lesmana 나는 거기에 당신의 대답을 upvoted. 슬프게도, 나의 find 버전은 나에게 그런 좋은 경고를주지 않는다 :(
Otheus

답변:


26

-delete-depth작동하지 않는 것을 의미 합니다 -prune( -depth잎으로 시작). GNU 버전 매뉴얼에 경고가 있습니다 ( -delete현재는 GNU find및 기타 구현 에서도 FreeBSD 확장이 지원됩니다 ).

info find --index-search=-delete

명령 행에서 '-delete'조치를 사용하면 '-depth'옵션 (* note find Expressions : :)이 자동으로 켜집니다. 이전에 '-print'를 사용하여 테스트 한 경우에는 놀라 울 수 있으므로 일반적으로 '-depth'를 명시 적으로 사용하는 것이 가장 좋습니다.

info find --index-search=-prune

'-delete'는 '-depth'를 의미하므로 '-delete'와 함께 '-prune'을 사용하면 의도 한 것보다 많은 파일이 삭제 될 수 있습니다.

여기에 rm대신 사용하는 옵션이 있습니다 .

find . -name save -prune -o -type f -exec rm -f {} +

( 다른 사람이 쓸 수있는 디렉토리가있는 경우 잠재적으로 안전하지 않습니다. 명령을 실행하는 동안 디렉토리를 심볼릭 링크로 바꾸어 현재 디렉토리 트리 외부의 파일을 삭제할 수 있습니다).

더 안전한 대안 :

find . -name save -prune -o -type f -execdir rm -f -- {} \;

위에서 언급 한 문제는 없지만 rm파일 당 하나를 실행하는 것을 의미 합니다. 는 --FreeBSD의 구현이 아닌 GNU 하나 그 접두사 파일 이름이 필요합니다 ./.

또는 Costas가 제안한대로 :

LC_ALL=C find . ! -name save ! -path '*/save/*' -type f -delete

(그러나 여전히 불필요하게 save디렉토리 로 내려갑니다 )

LC_ALL=C너무가 *바이트의 순서를 (심지어 현재 로케일에 유효한 문자를 형성하지 않는 것)과 일치합니다. 오류 메시지의 언어 (사용자의 언어 대신 영어)에 영향을 미칩니다.


여기서 보안 문제는 무엇입니까 rm?
jrw32982는 Monica

@ jrw32982, GNU find 매뉴얼에 링크 된 편집을 참조하십시오
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.