Bash

刪除名稱中沒有字元串的文件

  • March 21, 2021

我想刪除名稱中沒有字元串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文件路徑名中的任何位置(即包括任何目錄組件),而不僅僅是文件名。

引用自:https://unix.stackexchange.com/questions/443995