Bash
刪除名稱中沒有字元串的文件
我想刪除名稱中沒有字元串
999
的文件。我試過了:
grep -vlr 999 . | xargs -0 rm -f -- find . -print0 | grep --null-data -v 999 | xargs -0 rm --
但它們都不起作用。我正在使用帶有 bash:3.2.57 的 macOS Sierra。
在 中使用擴展的 globbing 模式
bash
:rm ./!(*999*)
這需要
shopt -s extglob
啟用(並且為了安全起見,如果所有文件名都包含 ,則不會錯誤地刪除shopt -s failglob
具有異常名稱的文件)。該模式將匹配目前目錄中的任何名稱,除了那些匹配的名稱。!(*999*)``999``!(*999*)``*999*
要同時刪除隱藏文件(名稱以點開頭的文件),請啟用
dotglob
帶有shopt -s dotglob
.只關心正常文件或正常文件的符號連結(而不是目錄等):
for name in ./!(*999*); do [ -f "$name" ] && rm "$name"; done
zsh
等效於上述循環的外殼將是rm ./(^(*999*))(.)
您的第一個命令將不起作用,因為
grep
它將查看文件內部。它將刪除所有沒有行999
的文件(如果您添加了該--null
選項以便它與xargs -0
.您的第二個命令將不起作用,因為
grep
在 macOS 上不支持--null-data
(但它確實有一個--null
選項,但僅用於生成文件名輸出時)。另請注意,它會查找999
文件路徑名中的任何位置(即包括任何目錄組件),而不僅僅是文件名。