刪除內容中不包含模式的所有文件

刪除內容中不包含模式的所有文件

如何刪除所有不包含指定文字的檔案。

我了解刪除具有指定文字的文件的解決方案,但我需要刪除不包含指定模式的文件。

以下命令建立不包含「成功運行」的檔案清單:

grep -c "successful run" *.out | grep -v ":1" > err.txt

我想直接刪除這些文件。

答案1

您識別適當文件的原始方法

grep -c "successful run" *.out | grep -v ":1"

是有缺陷的。主要關注點:

  • 如果一個檔案中有兩個或多個符合行怎麼辦?grep ":0"似乎更適合您問題標題中的條件(“不包含模式的文件”)。
  • 如果:1(或:0) 出現在檔案名稱中怎麼辦?所以grep ':0$'看起來更好。
  • 如果從第一個檔案名稱傳遞的任何檔案名稱中有換行符怎麼辦grep

我說不依賴grep -c;依賴於退出狀態grep1如果沒有選擇任何行。

for f in *.out; do
   [ -f "$f" ] && {
      grep -q -- "successful run" "$f"
      [ "$?" -eq 1 ] && rm -i -- "$f"
   }
done

筆記:

  • [ -f "$f" ] && …不會允許grep使用符合的目錄、fifo 等*.out;僅常規文件。
  • --解釋了的含義和意義這裡。如果存在名稱以 開頭的文件-,則可能會被誤認為是選項。處理這個問題的另一種方法是for f in ./*.out; do …。這樣每個擴充都$f以 開頭,./所以它不能以 開頭-
  • 我用的是rm -i以防萬一。測試解決方案後,您可能想要省略-i.
  • grep … || rm …更差。當真正的錯誤發生時(例如權限被拒絕),退出狀態grep大於1;您可能不想刪除該檔案。我的解決方案測試退出狀態是否準確1
  • 你的原始程式碼不會下降到子目錄中,我的也不會。如果您想要遞歸,那麼支援它的 shell(例如帶有shopt -s globstar和 的Bash **)或基於的解決方案find將很有用。

答案2

考慮到您的文件要么有一個“成功運行”,要么沒有,那麼:

若要尋找符合的文件,您可以執行以下操作:

grep -l "successful run" *.out > err.txt

尋找並刪除它們:

grep -l "successful run" *.out | xargs rm

若要尋找不符合的文件,請執行以下操作:

grep -vl "successful run" *.out > ok.txt

尋找並刪除它們:

grep -vl "successful run" *.out | xargs rm

標誌的意思是:

-l lists the files with matches
-v/--invert-match inverts the matching logic

相關內容