Linux에서 문자열이 포함 된 모든 파일을 찾아서 삭제하려면 어떻게해야합니까?


17

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


그 문자열은 파일 이름입니까?
rɑːdʒɑ

3
이름을 포함 하는 파일 foo(예 :) myfoo.jpg또는 바이트 시퀀스를 포함하는 파일 foo(이 바이트 시퀀스를 포함하는 바이너리 파일을 포함 할 수있는 파일)을 삭제 하시겠습니까?
hammar

답변:


33

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

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. 이런 식으로 파일 이름 목록을 스칼라 셸 변수에 넣는 것은 위험합니다.


17
$ 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이 제안한대로.


4
... 단축 될 수 있습니다 : find -type f -exec grep -q 'foo' {} \; -delete(따옴표 {}는 중복 되어 있으며 find파일을 삭제할 수도 있습니다.). grep정규식 을 허용합니다. 을 검색하려면 foo.bar이스케이프 -F처리하거나 패턴을 리터럴로 처리하는 옵션을 전달하십시오 .
Lekensteyn

어떤 이유는 사용 -exec echo rm "{}" \;하지 -delete?
vartec

1
@vartec 아니요, 사용 -delete합니다. 두 번째 -exec와 반향 으로 시연하는 것이 더 쉽습니다 .
Adrian Frühwirth

1
입력하는 것이 더 쉽습니다 -print(또는 -ls더 자세하게 볼) 이상 -exec echo rm "{}" \'. 외부 유틸리티가 필요하지 않습니다.
Lekensteyn

1
rm {}을 사용하는 경우, 파일 이름 자체의 특수 문자가 보간되지 않도록 rm-{}을 사용하십시오. 예를 들어, 쓰기 권한이있는 디렉토리에서 '-rf /'를 터치하십시오.
atk

1

아드리안의 말대로

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

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

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

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

의견을 게시 할 수있게되면 이와 같은 내용을 의견으로 게시해야합니다.
FSMaxB

예, 먼저 시도했지만 아직 의견을 게시 할 수 없다는 것을 깨달았습니다.
Petter H
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.