특정 텍스트가 포함된 파일을 삭제하는 터미널 명령이 있습니까?
세 개의 파일이 있고 그 중 일부에 "extract($_REQUEST)"라는 텍스트가 포함되어 있다고 가정해 보겠습니다.
file-1.php
: 이 파일에는 "extract($_REQUEST)"라는 텍스트가 포함되어 있습니다.file-2.txt
: 나는 아니에요file-3.html
: 이 파일에는 "extract($_REQUEST)"라는 텍스트가 포함되어 있습니다.
내가 찾고 있는 명령은 다음 파일을 삭제합니다: file-1.php
및 file-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
참고: 테스트 결과 정상적으로 작동했습니다.