我正在尝试删除某个目录中的一堆文件(在 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)
不要管道ls到xargs. 相反,管道find ... -print0到xargs -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使用通配符。
通常情况下,ls并find用换行分隔文件名,而是xargs用换行符分割它的输入或空间,导致您看到的行为。
可以xargs只用换行符来分割,但文件名中也可以有换行符。事实上,在 Linux 和 BSD 上,唯一 不允许的字符是“空”或零字节——所以在这种情况下你应该使用它。
在上面的示例 2 中,-print0告诉find用空字节分隔文件名;对于xargs -0. (其他一些工具也有类似的选项,例如sort -z或grep -zZ。)
“简短版本”使用简单的 shell 通配符(bash手册中的“模式” ——参见“路径名扩展”部分)。