Bash

rm -rf (1) 有什麼作用?

  • October 8, 2020

我試圖刪除重複的下載並出現執行錯誤

rm -rf *(1)*

這刪除了所有內容~/Downloads而沒有錯誤消息。

這個正則表達式到底是做什麼的?

在 POSIX shell 中,括號保留用於(cmd1; cmd2; cmd3) 在子 shell 中生成內部命令。由於*(1)*括號中的星號沒有用換行符或分號隔開,所以這是一個語法錯誤。當然,即使*;(1);*本身不是語法錯誤,也沒有任何意義。

在 Bash 中,如果extglob啟用,可以用 驗證shopt -p |& grep extglob,“*(pattern-list)匹配給定模式的零次或多次出現”。在這種情況下,*(1)* 總是擴展到目錄中的所有文件,因為*(1)可以匹配模式的零次出現,1並且*將匹配所有其他名稱,無論它們是什麼。結果是所有文件(和目錄,它們也是文件)都被刪除。

另請注意,shell 使用 shell 模式(稱為 glob),這與正則表達式不同。有關詳細資訊,請參閱Gilles 的回答。在您的情況下,要刪除名稱包含的每個文件(1),您需要轉義或引用括號以保留其字面含義,即

rm -rf *'(1)'*
rm -rf *\(1\)*
rm -rf *"(1)"*

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