Linux

帶有 rm + 文件名的 xargs 包含空格

  • April 5, 2018

我正在編寫一個簡單的程序來刪除所有獲取的文件。文件可以包含空格,所以我添加了引號,如下所示

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非常清楚如何將帶有空格(或換行符或任何可能)的路徑名傳遞給命名的實用程序。

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