如何刪除所有不包含指定文字的檔案。
我了解刪除具有指定文字的文件的解決方案,但我需要刪除不包含指定模式的文件。
以下命令建立不包含「成功運行」的檔案清單:
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
;依賴於退出狀態grep
,1
如果沒有選擇任何行。
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