是否有終端命令可以刪除包含給定文字的檔案?
假設我有三個文件,其中一些包含文字「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
注意:經過測試,效果很好