답변:
안전한 방법은 다음과 같습니다.
grep -lrIZ foo . | xargs -0 rm -f --
-l
검색 패턴과 일치하는 파일의 파일 이름을 인쇄합니다.-r
foo
주어진 디렉토리에서 패턴 을 재귀 적으로 검색합니다 .
. 그래도 문제가 해결되지 않으면을 시도하십시오 -R
.-I
(capital i
)은 PDF와 같은 이진 파일을 건너 뜁니다.-Z
공백을 포함하는 이름이 잘못된 방식으로 해석되지 않도록 파일 이름이 0 (즉, 널)으로 끝나도록합니다 (즉, 하나 대신 여러 이름으로).xargs -0
파일 이름을에서 grep
로 공급하여 rm -f
단어를 0 바이트로 구분합니다 (의 -Z
옵션을 기억하십시오 grep
).--
는 종종 잊혀지지 만 옵션의 끝을 표시하고 이름이로 시작하는 파일을 제거 할 수 있도록하는 것이 매우 중요합니다 -
.어떤 파일이 삭제 되려고하는지 확인하려면 해당 | xargs -0 rm -f --
부분을 제거 하고 Z
옵션을로 설정하십시오 grep
.
다른 사용자는 다음과 같은 것을 제안했는데 안전하지 않으므로 실행하면 안됩니다 .
files=`grep foo * | cut -d: -f1`
rm -f $files # unsafe, do not run it!
ImportantStuff
삭제하고 obsolete ImportantStuff
포함 하고 싶지 않은 파일 이있는 경우이 명령을 실행할 때 해석되지 않을 때 공백으로 분리 되므로 foo
잃어 버립니다 ImportantStuff
( ! 안됩니다 obsolete ImportantStuff
) $files
. 이런 식으로 파일 이름 목록을 스칼라 셸 변수에 넣는 것은 위험합니다.
$ find -type f -exec grep -q "foo" {} \; -exec echo rm -- {} \;
이 포함 된 파일을 재귀 적으로 검색합니다 foo
. 두 번째 -exec
는 첫 번째 가 exec
성공적으로 종료 된 경우, 즉 grep
일치 하는 경우에만 실행됩니다 . echo
출력이 올 바르면 드라 이런을 제거 하십시오.
또는 대안으로
$ find -type f -exec grep -q "foo" {} \; -print
과
$ find -type f -exec grep -q "foo" {} \; -delete
Lekensteyn이 제안한대로.
find -type f -exec grep -q 'foo' {} \; -delete
(따옴표 {}
는 중복 되어 있으며 find
파일을 삭제할 수도 있습니다.). grep
정규식 을 허용합니다. 을 검색하려면 foo.bar
이스케이프 -F
처리하거나 패턴을 리터럴로 처리하는 옵션을 전달하십시오 .
-exec echo rm "{}" \;
하지 -delete
?
-delete
합니다. 두 번째 -exec
와 반향 으로 시연하는 것이 더 쉽습니다 .
-print
(또는 -ls
더 자세하게 볼) 이상 -exec echo rm "{}" \'
. 외부 유틸리티가 필요하지 않습니다.
아드리안의 말대로
그러나 실수로 "음식"을 포함하는 파일을 삭제하지 않도록 단어 경계를 foo에 추가합니다 (음식이 포함 된 모든 것을 삭제하지 않는 한 원하는 경우).
$ find -type f -exec grep -q "\<foo\>" {} \; -delete
acutally, 삭제하기 전에 출력을 리디렉션하여 삭제하기 전에 검토 할 수 있습니다.
$ find -type f -exec grep -q "\<foo\>" > /tmp/list_of_files_to_delete