我在 Ubuntu 的 bash 下使用此命令时遇到了一些问题:
rm $(find . -name "*.exe")
我的目标是递归地删除所有以 结尾的文件.exe
。但有些文件有空格,这会破坏命令。
关于如何解决这个问题有什么建议吗?
答案1
find . -name "*.exe" -exec rm -f '{}' +
这有find
格式化命令和参数,并小心避免混淆名称(通过将每个名称作为单独的参数传递给rm
)。“+”表示“在一次执行中尽可能合理地执行尽可能多的操作rm
”。
答案2
您可以将输出从管道传输find
到xargs
,并指定仅将换行符视为文件名之间的分隔符:
find -name '*.exe' | xargs -d \\n rm
更便携的方法是使用空字符作为分隔符:
find -name '*.exe' -print0 | xargs -0 /bin/rm
请参阅find
的联机帮助页以获取执行此操作的示例。
另一个选择是使用您使用的命令,但将 bash 的内部参数分隔符设置为仅换行符:
IFS=$'\n'; rm $(find . -name "*.exe");
这里$'...'
使用引号构造来创建换行符。如果文件名列表很长,这种方法的弹性会比使用 差xargs
。
答案3
只需将-delete
选项传递给find
:
find . -name "*.exe" -delete
这可以节省您的引用和任何其他文件名麻烦,并且可能比-exec
不需要生成新进程的速度更快。
答案4
手动转义字符可能会对您有所帮助。
find . -name "*.exe" | sed -s 's/\ /\\ /' | xargs rm -f