Linux,查找所有匹配模式的文件并删除

Linux,查找所有匹配模式的文件并删除

查找所有文件名中带有下划线的文件(递归),然后通过命令行将其删除。

答案1

这是最安全且最快的变体:

find /path -type f -name '*_*' -delete

它不需要管道,并且如果文件包含空格或通配符或其他任何会阻塞的内容,它也不会中断。这里要记住的最简单的规则是从不解析find输出grep如果您以后想对文件名进行某些操作,则永远不要对文件名进行任何操作。您可以find直接使用几乎任何操作。

也可以看看:GNUfind手册 – 删除文件

答案2

这包括被视为文件的目录。其他一些使用参数如果文件名包含空格将会失败。

find . -name '*_*' -exec rm -rf {} \;

如果您只想要常规文件:

find . -type f -name '*_*' -exec rm -f {} \;

答案3

好的,让我们逐步进行。

作为第一步,这只是一个简单的练习,将通配符传递给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

答案4

find . -type f -regex ".*_.*" | xargs rm -f

解释
-type f仅查找文件
-regex ".*_.*"仅选择带有下划线的文件
xargs rm -f然后强制删除选定的文件(删除前从不提示)

相关内容