특정 텍스트가 포함된 파일을 삭제하는 터미널 명령이 있습니까?
세 개의 파일이 있고 그 중 일부에는 "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
참고: 테스트 후 효과가 매우 좋습니다.