Linux에서 문자열이 포함 된 모든 파일을 찾아서 삭제하려면 어떻게해야합니까? 파일을 삭제하고 싶습니다 foo. Linux에서 bash를 사용하여

문자열이 포함 된 모든 파일을 삭제하고 싶습니다 foo. Linux에서 bash를 사용하여 어떻게 할 수 있습니까?



답변

안전한 방법은 다음과 같습니다.

grep -lrIZ foo . | xargs -0 rm -f --
  • -l 검색 패턴과 일치하는 파일의 파일 이름을 인쇄합니다.
  • -rfoo주어진 디렉토리에서 패턴 을 재귀 적으로 검색합니다 .. 그래도 문제가 해결되지 않으면을 시도하십시오 -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이 제안한대로.


답변

아드리안의 말대로

그러나 실수로 “음식”을 포함하는 파일을 삭제하지 않도록 단어 경계를 foo에 추가합니다 (음식이 포함 된 모든 것을 삭제하지 않는 한 원하는 경우).

 $ find -type f -exec grep -q "\<foo\>" {} \; -delete

acutally, 삭제하기 전에 출력을 리디렉션하여 삭제하기 전에 검토 할 수 있습니다.

 $ find -type f -exec grep -q "\<foo\>" > /tmp/list_of_files_to_delete


답변