ls | grep | rm —如何格式化此命令?


11

我正在尝试删除某个目录中的一堆文件(在Mac OS X上使用Terminal)

ls | grep \([1-9]\) | xargs rm

应该可以解决问题,但事实并非如此。我正在尝试删除文件名中括号内带有一位数字的任何文件(从网络上下载的重复项),但最终这样做是这样的:

> rm: 520syllabus2010: No such file or
> directory rm: (3).pdf: No such file or
> directory

因为它不能正确解释空间。它应该删除“ 520syllabus2010(3).pdf”

这样做的正确方法是什么?

谢谢杰夫


1
您的示例文件名不包含文字#
本杰明·班尼尔

1
@honk:他不是在寻找文字#
伊格纳西奥·巴斯克斯

1
由于外壳程序的扩展,如果cwd具有名为eg的文件,则此操作将无法按预期进行(3)。最好引用引号,以便外壳程序不影响它们。
伊格纳西奥·巴斯克斯

Answers:


19

简洁版本:

rm *\([1-9]\)*

不要通过管道连接lsxargs。而是将管道输送find ... -print0xargs -0,以避免出现此类问题。

find . -maxdepth 1 -name '*([1-9])*' -print0 | xargs -0 rm

...可以写成:

find . -maxdepth 1 -name '*([1-9])*' -exec rm {} \;

和:

find . -maxdepth 1 -name '*([1-9])*' -delete

可以进一步缩短为仅rm使用通配符。


通常情况下,lsfind用换行分隔文件名,而是xargs用换行符分割它的输入空间,导致您看到的行为。

可以告诉xargs您仅按换行符分隔,但文件名中也可以包含换行符。实际上,在Linux和BSD上,唯一 不允许使用的字符“空”或零字节 -因此在这种情况下应使用该字符

在上面的示例2中,-print0告知find使用空字节分隔文件名;相同的xargs -0。(其他一些工具也有类似的选项,例如sort -zgrep -zZ。)

“简短版本”使用简单的外壳通配符(bash手册中的 “模式” –参见“路径名扩展”部分)。


1
为了安全起见,最好使用*" "\\([1-9]\\).*这样的格式,以便仅删除在(a,公平的)句号之前的括号内有空格的文件。
伊格纳西奥·巴斯克斯

我对这种语法不是很熟悉,但是根据投票结果,我尝试了一下,您知道什么...有效!谢谢!
杰夫,

1
+1。-print0对于正确传递到xargs是必不可少的。
克里斯·瑞
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.