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

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

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

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

简洁版本:

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使用通配符。


通常,文件名用换行符分隔,但ls输入用换行符分隔findxargs或者空间,从而产生您所看到的行为。

可以告诉xargs仅通过换行符进行拆分,但是文件名称中也有换行符。事实上,在 Linux 和 BSD 上,仅有的 不允许的字符是个“无效的”或零字节– 因此在这种情况下您应该使用它。

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

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

相关内容