Bash
rm -rf (1) 有什麼作用?
我試圖刪除重複的下載並出現執行錯誤
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)"*