如何在 Linux 上删除所有文件名包含空格的文件?

如何在 Linux 上删除所有文件名包含空格的文件?

无法删除我自己的问题,请改用覆盖

答案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不是标准的,但 GNUfindxargs以及 FreeBSDfindxargs都能理解它们。然而,即使是这样也是可以改进的。我们根本不需要生成任何额外的进程。GNU 和 FreeBSDfind都可以unlink(2)直接调用系统调用:

find $BASE_DIR/ -name '* *' -delete

作为最后的预防措施,可以阻止您在某些情况下做超出预期的事情,请记住文件系统可以包含的不仅仅是常规文件:

find $BASE_DIR/ -name '* *' -type f -delete

答案2

有什么问题

rm *\ *

或者

rm *' '*

或者

rm *" "*

您可以在执行“rm”之前尝试“ls”,以便确定自己在做什么。

相关内容