![刪除特定內容的文件](https://rvso.com/image/178487/%E5%88%AA%E9%99%A4%E7%89%B9%E5%AE%9A%E5%85%A7%E5%AE%B9%E7%9A%84%E6%96%87%E4%BB%B6.png)
一個目錄下有上千個資料檔(副檔名相同),如何刪除那些包含特定參數語句的資料檔?
例如,如果我要刪除包含該行的所有文件
Key = 0
我可以做類似的事情嗎
grep -i "Key = 0" * | rm *
答案1
您可以在 shell 中使用以下命令。如果要搜尋的模式是,這應該可以完成工作Key = 0
grep -lrIZ "Key = 0" . | xargs -0 rm -f --
通用命令:
grep -lrIZ "<Pattern to be searched in the file>" . | xargs -0 rm -f --
答案2
grep
使用+的管道的主要問題rm
是rm
不從其標準輸入流中讀取,這意味著它不會從grep
管道左側的命令中讀取任何內容。
相反,rm *
管道右側的 會忽略所有輸入並rm
在目前目錄中的每個可見檔案名稱上執行。
rm
忽略不讀取其標準輸入的問題,您的grep
命令有兩個主要問題:
- 它輸出與檔案名稱相符的行。這沒有用,
rm
因為我們需要知道僅有的我們要刪除的檔案的檔案名稱。 - 它匹配
Key = 0
為子字串,這意味著它也匹配Crypto Key = 0x01
等。
find . -type f -exec grep -q -F -x 'Key = 0' {} \; -exec rm -f {} +
或者,對於 GNU find
(和其他一些),
find . -type f -exec grep -q -F -x 'Key = 0' {} \; -delete
這兩者都會在當前目錄或以下目錄中查找常規文件,並且對於每個找到的文件,它將執行grep -q -F -x 'Key = 0'
.該grep
命令將返回退出狀態,表示文件中是否有一行確切地 Key = 0
(沒有別的)。
如果找到這樣的行,第二個find
指令將使用其謂詞刪除該檔案。-delete
第一個find
命令將收集包含該行的檔案的路徑名,然後rm -f
批次運行這些檔案。
使用的標誌grep
是
-q
,安靜運轉。該實用程式不會輸出匹配行,但會在第一次匹配後成功退出,或者如果檔案不包含匹配項,則退出狀態為非零。-F
,用於固定字串匹配。我們匹配的是字串,而不是正規表示式。-x
,僅查找全行匹配項。這與使用錨定到行的開頭和結尾的正規表示式具有相同的效果。
我沒有在這裡使用-i
with grep
,因為這也會刪除包含諸如 等行的文件KEY = 0
,kEY = 0
並且您對這些大小寫變化隻字未提。
您是否希望find
命令被限制為特定的檔案名稱後綴,例如,然後在執行 之前在命令中.ext
使用。例如:-name '*.ext'
find
grep
find . -name '*.ext' -type f -exec grep -q -F -x 'Key = 0' {} \; -exec rm -f {} +