Shell
如何用 xargs 引用參數
假設我想刪除文件夾中大於 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
在支持的情況下,這是迄今為止最安全和最有效的。
如果您堅持使用
xargs
andrm
withfind
,只需添加-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 find
GNU 系統上:
-print0
真的; 在標準輸出上列印完整的文件名,後跟一個空字元(而不是使用的換行符
find
這允許處理輸出的程序正確解釋包含換行符或其他類型空格的文件名。該選項對應於 的-0
選項xargs
。
我有一個類似的要求,最終使用
-I
開關來擁有一個佔位符,並且我能夠引用它。find . -size +1M | xargs -I {} rm "{}"