如何使用 xargs 引用参数

如何使用 xargs 引用参数

假设我要删除文件夹中大于 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

在支持的情况下,这是迄今为止最安全、最有效的。

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

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

-print0-0是非标准的,但很常见。 (如果没有找到任何东西-r,就避免运行)不太常见,但如果你不支持它,你可以忽略它,因为如果调用时不带参数)。rmfindxargsrm-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

真的;在标准输出上打印完整的文件名,后跟一个空字符(而不是使用的换行符-print)。这允许处理输出的程序正确解释包含换行符或其他类型空格的文件名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

相关内容