![如何使用 xargs 引用参数](https://linux22.com/image/34709/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20xargs%20%E5%BC%95%E7%94%A8%E5%8F%82%E6%95%B0.png)
假设我要删除文件夹中大于 1 MB 的所有文件。
$ find . -size +1M | xargs -0 rm
这不会删除名称中包含空格的文件。所以我希望它引用它发送到的所有参数rm
。如果find
给出它,Some report.docx
它应该传递"Some report.docx"
给rm
.
我怎样才能做到这一点?
答案1
我有类似的要求,最终使用 switch-I
来设置占位符,并且我能够引用它。
find . -size +1M | xargs -I {} rm "{}"
答案2
由于您已经在使用该非标准1M
,因此您的实现很可能find
也支持-delete
.因此,只需使用:
find . -type f -size +1M -delete
在支持的情况下,这是迄今为止最安全、最有效的。
如果您坚持使用xargs
and rm
with find
,只需添加-print0
您的命令:
find . -type f -size +1M -print0 | xargs -r0 rm -f --
(-print0
和-0
是非标准的,但很常见。 (如果没有找到任何东西-r
,就避免运行)不太常见,但如果你不支持它,你可以忽略它,因为如果调用时不带参数)。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
。
答案3
选项-0
意味着xargs
管道的输出被解释为空终止项。在这种情况下,您还需要使用 为管道创建输入find ... -print0
。
答案4
实际上只是重申对问题的现有评论,以便它出现在答案下,在我的例子中,我用来locate
查找包含特定字符串的文件名:
伊万·扎哈里亚切夫写道:用于xargs -d$'\n'
将分隔符限制为仅换行(而不是空格;这不会专门处理报价等-- 我检查过 GNU 系统) -- 给出的答案
stackoverflow.com/a/33528111/94687
例如,使用伊万的建议,
$ locate -i example_string | xargs -d$'\n' md5sum