我正在尝试删除某个目录中的一堆文件(在 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]\)*
不要通过管道传输ls
到xargs
。而应通过管道传输find ... -print0
到xargs -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
输入用换行符分隔find
xargs
或者空间,从而产生您所看到的行为。
可以告诉xargs
仅通过换行符进行拆分,但是文件能名称中也有换行符。事实上,在 Linux 和 BSD 上,仅有的 不允许的字符是个“无效的”或零字节– 因此在这种情况下您应该使用它。
在上面的示例 2 中,-print0
告诉find
用空字节分隔文件名; 也一样xargs -0
。 (其他一些工具也有类似的选项,例如sort -z
或grep -zZ
。)
“简短版本”使用简单的 shell 通配符(“模式”bash
手动的– 参见“路径名扩展”部分。