Shell

如何用 xargs 引用參數

  • December 28, 2021

假設我想刪除文件夾中大於 1 MB 的所有文件。

$ find . -size +1M | xargs -0 rm

這不會刪除名稱中有空格的文件。所以我希望它引用它發送到的所有參數rm。如果find給它Some report.docx它應該傳遞"Some report.docx"rm.

我怎樣才能做到這一點?

由於您已經在使用該 non-standard 1M,因此您的find實現很可能也支持-delete. 所以,只需使用:

find . -type f -size +1M -delete

在支持的情況下,這是迄今為止最安全和最有效的。

如果您堅持使用xargsand rmwith find,只需添加-print0您的命令:

find . -type f -size +1M -print0 | xargs -r0 rm -f --

-print0並且-0是非標準的,但很常見。 (如果沒有找到任何東西,則完全-r避免執行)不太常見,但如果您不支持它,您可以省略它,因為不會抱怨 if無參數呼叫)。rm``find``xargs``rm``-f

標準語法是:

find . -type f -size +1048576c -exec rm -f -- {} +

另一種方式:

find . -type f -size +1M -execdir rm -f -- {} +

(這比-exec/更安全,xargs -0並且可以使用非常深的目錄樹(其中完整的文件路徑最終會大於PATH_MAX),但這也是非標準的,並且rm對於每個包含至少一個大文件的目錄至少執行一個,所以會效率較低)。

man findGNU 系統上:

-print0

真的; 在標準輸出上列印完整的文件名,後跟一個空字元(而不是使用的換行符-print)。find這允許處理輸出的程序正確解釋包含換行符或其他類型空格的文件名。該選項對應於 的-0選項 xargs

我有一個類似的要求,最終使用-I開關來擁有一個佔位符,並且我能夠引用它。

find . -size +1M | xargs -I {} rm "{}"

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