如何用xargs引用参数


15

假设我要删除文件夹中大于1 MB的所有文件。

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

这不会删除名称中带有空格的文件。因此,我希望它引用发送给的所有参数rm。如果find给出,Some report.docx则应传递"Some report.docx"rm

我怎样才能做到这一点?


1
在使用进行任何操作之前,您应该阅读此mywiki.wooledge.org/UsingFind?highlight=%28xargs%29xargs。另外,正如Wiki所建议的那样,请在不将xargs传递-print0给的情况下使用find
Valentin Bajrami 2014年


使用xargs -d$'\n'的分隔符限制为仅新线(而不是空格,这不会处理引号等特殊 -我一个GNU系统检查) -在给出的答案stackoverflow.com/a/33528111/94687
imz-Ivan Zakharyaschev

Answers:


13

使用简单:

find . -size +1M -delete

如果你坚持使用xargs,并rmfind,只需添加-print0在您的命令:

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

另一种方式:

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

来自man find

-print0
    True; print the full file name on the standard output, followed by a null 
character (instead of the newline character that -print uses). This allows file names 
that contain newlines or other types of white space to be correctly interpreted by 
programs that process the find output. This option corresponds to the -0 option of 
xargs.

3
这解决了问题,但是在其他情况下,实际上引用引号将很有用。因此,我将继续寻求其他答案。+1是一个简单的解决方案。
Kshitiz Sharma 2014年

2
@KshitizSharma不,除非文件名包含引号,否则您不想传递"Some report.docx"rm。你想要的是Some report.docx毫发无损地传递给rm。KasiyA的答案(现在)显示了使用的一般方法find。[KasiyA:对于之前的错误ping感到抱歉。]
不要再作恶了'

@吉尔斯正确。在bash中,我通常引用字符串以使字符串不受干扰。因此,通过引用我的意思是发送文件名作为一个参数为RM而不是被分裂成$0$1
Kshitiz夏尔马

在OSX上,我xargs -0代替xargs -r0
罗尔夫(Rolf)'18

8

选项-0xargs意思是管道的输出被解释为空终止项。在这种情况下,您还需要使用来为管道创建输入find ... -print0


6

我有一个类似的要求,最终使用-I开关来拥有一个占位符,并且我能够引用它。

find . -size +1M | xargs -I {} rm "{}"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.