Linux
帶有 rm + 文件名的 xargs 包含空格
我正在編寫一個簡單的程序來刪除所有獲取的文件。文件可以包含空格,所以我添加了引號,如下所示
find -name "*.scala" | xargs -d "\n" -I {} rm \"{}\"
以上失敗並出現錯誤:無法刪除,沒有這樣的文件或目錄。但是,如果我列出相同的文件,它們就在那裡。另外,如果我在下面執行並使用 bash 執行它;有用
find -name "*.scala" | xargs -d "\n" -I {} echo rm \"{}\" | bash
有人可以解釋為什麼第一種情況不起作用嗎?
xargs -d "\n" -I {} rm \"{}\"
這假定 GNU coreutils 的版本
xargs
支持-d
指定分隔符的選項。這將無法與您的
find
命令一起使用,因為它會將雙引號添加到由find
. 這意味著使用文字路徑名而不是./somedir/file.scala
呼叫來完成。rm``"./somedir/file.scala"
例子:
$ touch hello $ touch '"hello"' $ ls "hello" hello $ echo hello | xargs -d "\n" -I {} rm \"{}\" $ ls hello
當您將生成的命令通過管道傳輸到時,它會起作用,
bash
因為bash
會刪除引號。如果您沒有通過額外的努力首先添加引號,它可能也會起作用:
xargs -d "\n" -I {} rm {}
要正確刪除文件,請使用
find . -type f -name '*.scala' -delete
或者,如果您仍想使用
xargs
:find . -type f -name '*.scala' -print0 | xargs -0 rm
find
它將和之間的路徑名xargs
作為一個以空分隔的列表傳遞。Nul (\0
) 是 Unix 系統上路徑名中唯一不允許出現的字元。文件名也不能包含/
,但允許換行。第三種選擇是
rm
直接呼叫find
:find . -type f -name '*.scala' -exec rm {} +
請注意,
{}
不需要(也不應該)引用它,因為它find
非常清楚如何將帶有空格(或換行符或任何可能)的路徑名傳遞給命名的實用程序。