![Linux,查找所有匹配模式的文件并删除](https://linux22.com/image/1392870/Linux%EF%BC%8C%E6%9F%A5%E6%89%BE%E6%89%80%E6%9C%89%E5%8C%B9%E9%85%8D%E6%A8%A1%E5%BC%8F%E7%9A%84%E6%96%87%E4%BB%B6%E5%B9%B6%E5%88%A0%E9%99%A4.png)
查找所有文件名中带有下划线的文件(递归),然后通过命令行将其删除。
答案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
不是标准的,但 GNUfind
和xargs
以及 FreeBSDfind
和xargs
都能理解它们。然而,即使是这样也是可以改进的。我们根本不需要生成任何额外的进程。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
然后强制删除选定的文件(删除前从不提示)