无法删除我自己的问题,请改用覆盖
答案1
好的,让我们逐步进行。
让我们假设你真的做也想查看子目录,即使这仅暗示在您的问题中。
作为第一步,这只是一个简单的练习,将通配符传递给find
命令,当然记得引用它,并对rm
找到的每个文件执行该命令:
find $BASE_DIR/ -name '* *' -exec rm {} \;
但当然,这非常低效。它会为每个单独的文件启动整个rm
过程。因此,虽然我们可以绕道而行,\+
但这并不是我们最终要走的路,所以让我们走捷径,将xargs
文件名分批分组:
find $BASE_DIR/ -name '* *' -print | xargs rm
但这有两个安全漏洞。首先,如果发现任何文件名恰好以减号开头,rm
则会将其视为命令行选项而不是文件名,并生成错误。(该-exec rm {}
版本也存在此问题。)其次,正如您所注意到的,包含空格的文件名将无法被正确处理xargs
。因此,进一步的迭代是为了使其更加坚固:
find $BASE_DIR/ -name '* *' -print0 | xargs -0 rm --
当然,还有一些rm
你可能不想要的交互功能:
find $BASE_DIR/ -name '* *' -print0 | xargs -0 rm -f --
-print0
和选项-0
不是标准的,但 GNUfind
和xargs
以及 FreeBSDfind
和xargs
都能理解它们。然而,即使是这样也是可以改进的。我们根本不需要生成任何额外的进程。GNU 和 FreeBSDfind
都可以unlink(2)
直接调用系统调用:
find $BASE_DIR/ -name '* *' -delete
作为最后的预防措施,可以阻止您在某些情况下做超出预期的事情,请记住文件系统可以包含的不仅仅是常规文件:
find $BASE_DIR/ -name '* *' -type f -delete
答案2
有什么问题
rm *\ *
或者
rm *' '*
或者
rm *" "*
您可以在执行“rm”之前尝试“ls”,以便确定自己在做什么。