주어진 텍스트를 포함하는 파일을 찾고 삭제하는 Linux 명령

주어진 텍스트를 포함하는 파일을 찾고 삭제하는 Linux 명령

특정 텍스트가 포함된 파일을 삭제하는 터미널 명령이 있습니까?

세 개의 파일이 있고 그 중 일부에 "extract($_REQUEST)"라는 텍스트가 포함되어 있다고 가정해 보겠습니다.

  • file-1.php: 이 파일에는 "extract($_REQUEST)"라는 텍스트가 포함되어 있습니다.
  • file-2.txt: 나는 아니에요
  • file-3.html: 이 파일에는 "extract($_REQUEST)"라는 텍스트가 포함되어 있습니다.

내가 찾고 있는 명령은 다음 파일을 삭제합니다: file-1.phpfile-3.html.


업데이트: 파일이 파일을 삭제해야 합니다경우에만"extract($_REQUEST)"는 파일의 유일한 텍스트 줄입니다. 아래 예를 참조하세요.

  • file-4.php: 이 파일단지"extract($_REQUEST)" 텍스트가 포함되어 있습니다.
  • file-5.php: 이 파일에는 "extract($_REQUEST)"라는 텍스트가 포함되어 있습니다.그리고 다른 텍스트 줄

그런 다음 명령은 삭제 file-4.php되고 삭제되지 않습니다 file-5.php.

답변1

find  . -maxdepth 1 -type f \
  -exec fgrep -q  'extract($_REQUEST)' '{}' ';' \ 
  -not -exec fgrep -vq  'extract($_REQUEST)' '{}' ';' \ 
  -delete
  • find .현재 디렉토리 검색
  • -maxdepth 1하위 디렉터리가 없습니다.
  • -type f파일 찾기
  • -exec각각에 대해 이 테스트를 실행합니다.
    • fgrep일반 문자열 검색
      • -q 눈에 보이는 출력이 없는 경우
      • 'extract($_REQUEST)'이 문자열에 대해
      • '{}'당신이 찾은 파일에서
      • ';' [실행 끝]
  • -not다음 시험은 아니고
    • -exec다시 실행
      • fgrep다시 fgrep
        • -vq하지만 이번에는 일치하지 않는 줄을 찾으세요.
        • 'extract($_REQUEST)'같은 패턴을 찾아보세요
        • '{}'파일에
    • ';' [실행 끝]
  • -delete삭제해

exec도 테스트이고 fgrep이 일치하는 항목을 찾으면 테스트가 성공하고 삭제가 실행되기 때문에 이는 작동합니다. grep이 false를 반환하면 삭제가 완료되지 않습니다.

답변2

grep -FRl 'extract($_REQUEST)' | xargs rm -fv
  • grep- 파일에서 텍스트를 검색합니다.
  • -F- 문자열을 있는 그대로 처리하고 가능한 정규식을 무시합니다.
  • -R- 재귀 검색.
  • -l- 파일 이름만 인쇄합니다.
  • xargs- 다음 프로그램에 출력을 제공합니다.
  • rm- 제거하다.
  • -f- 강제("확실합니까?"라고 묻지 마세요).
  • -v- 선택 사항입니다. 제거된 파일을 가져옵니다.

업데이트:

정확한 텍스트가 있는 파일만 삭제하려면 파일의 문자 수도 확인하는 것이 좋습니다.

for i in $(grep -FRl 'extract($_REQUEST)'); do [[ $(cat $i | wc -c) == "19" ]] && rm -fv $i; done
  • wc -c- 파일의 문자 수를 계산합니다. 제공하신 예제( extract($_REQUEST))의 길이는 19자(개행 문자 포함)이므로 예제에서는 이 숫자를 사용했습니다. 상황에 맞게 자유롭게 변경하세요.

답변3

명령

find  . -maxdepth 1 -type f -exec grep -l  "string_to_be_searched" {} \;|awk '{print $1}'| sed "s/\.\///g"| awk '{print "rm -rvf" " " $1}'| sh

참고: 테스트 결과 정상적으로 작동했습니다.

관련 정보