刪除特定內容的文件

刪除特定內容的文件

一個目錄下有上千個資料檔(副檔名相同),如何刪除那些包含特定參數語句的資料檔?

例如,如果我要刪除包含該行的所有文件

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使用+的管道的主要問題rmrm不從其標準輸入流中讀取,這意味著它不會從grep管道左側的命令中讀取任何內容。

相反,rm *管道右側的 會忽略所有輸入並rm在目前目錄中的每個可見檔案名稱上執行。

rm忽略不讀取其標準輸入的問題,您的grep命令有兩個主要問題:

  1. 它輸出與檔案名稱相符的行。這沒有用,rm因為我們需要知道僅有的我們要刪除的檔案的檔案名稱。
  2. 它匹配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,僅查找全行匹配項。這與使用錨定到行的開頭和結尾的正規表示式具有相同的效果。

我沒有在這裡使用-iwith grep,因為這也會刪除包含諸如 等行的文件KEY = 0kEY = 0並且您對這些大小寫變化隻字未提。

您是否希望find命令被限制為特定的檔案名稱後綴,例如,然後在執行 之前在命令中.ext使用。例如:-name '*.ext'findgrep

find . -name '*.ext' -type f -exec grep -q -F -x 'Key = 0' {} \; -exec rm -f {} +

相關內容