ls | | | rm -- 如何格式化这个命令?

Jef*_*eff 11 grep ls rm

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

ls | grep \([1-9]\) | xargs rm
Run Code Online (Sandbox Code Playgroud)

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

> rm: 520syllabus2010: No such file or
> directory rm: (3).pdf: No such file or
> directory
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢,杰夫

use*_*686 19

精简版:

rm *\([1-9]\)*
Run Code Online (Sandbox Code Playgroud)

不要管道lsxargs. 相反,管道find ... -print0xargs -0,以避免此类问题。

find . -maxdepth 1 -name '*([1-9])*' -print0 | xargs -0 rm
Run Code Online (Sandbox Code Playgroud)

...可以写成:

find . -maxdepth 1 -name '*([1-9])*' -exec rm {} \;
Run Code Online (Sandbox Code Playgroud)

和:

find . -maxdepth 1 -name '*([1-9])*' -delete
Run Code Online (Sandbox Code Playgroud)

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


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

可以xargs只用换行符来分割,但文件名中也可以有换行符。事实上,在 Linux 和 BSD 上,唯一 不允许的字符“空”或零字节——所以在这种情况下你应该使用它。

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

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