删除批量文件

删除批量文件

我需要删除所有 *.html 文件。但是,我有一个父文件夹,里面有很多子文件夹,每个子文件夹中都有一个 HTML 文件。我可以通过访问每个子文件夹来删除文件。但是,我需要直接从父文件夹中删除每个 HTML 文件

答案1

最简单的方法是:

find . -type f -name '*.html' -delete   

从您想要启动它的目录执行此操作。

  • find是搜索某些内容的命令
  • .表示从您当前所在的目录
  • f表示仅搜索文件(d针对目录)
  • 并搜索name结尾为.html
  • 并且 find 有一个选项delete可以

答案2

在为您提供粘贴并运行的解决方案之前,我想解释一下 Linux Shell 的一些最佳实践和自动化模式。相同的概念也适用于其他 IT 领域:

  • 分而治之:将问题拆分成(独立的)部分以便于解决
  • 关注点分离:此处删除为命令;查找为查询(CQRS)
  • 管道和过滤器:链中最佳工具的组合

预览和管道解释

虽然下面的方法不适用于子目录(递归),但它说明了一种组合命令的安全和模块化方法。

a)简单列出并删除(操作前先预览):

  1. 列出所有 HTML 文件(仅列出,不递归) ls *.html

  2. 然后移除 rm *.html

这是一个安全第一方法。在删除之前,您可以预览并检查文件列表。如果确定要继续,只需更改命令命令即可。

或者,您可以使用以下方式轻松扩展您的工作流程管道

b) 直接与参数

ls *.html | xargs -r0 rm

xargs是必要的,因为 rm 无法读取标准输入。 看: http://stackoverflow.com/questions/20307299/ddg#20307392

结合-r0了两个选项:-0将处理极端文件名(it's done.html其中包含换行符、空格或引号),这些文件名更为稳健以 NUL 字符分隔-r如果没有输入,将停止运行。

看: 如何递归删除当前目录中特定扩展名的所有文件?

和: https://unix.stackexchange.com/a/83712

直接使用删除全局

在某些 shell 中(bash 第 4 版及以上版本、ksh、zsh),你可以使用通配符 (全球星) 在路径中。

看:https://unix.stackexchange.com/questions/23576/how-do-i-recursively-delete-directories-with-wildcard

如何检查/启用 globstar

直接删除(危险):

rm **/*.html

这种直接删除命令很危险,因为一个小小的拼写错误就会产生不利影响。例如,如果意外插入一个空格,rm *.html它将变成rm * .html。不幸的是,它将删除所有文件,并可能打印未找到第二条路径“.html”的错误。

合并:查找并删除

查找(在目录层次结构中搜索文件)并删除

  1. 使用管道(符合 POSIX 标准:可在更多系统上运行)

    find . -type f -name "*.html" | xargs -r0 rm

  2. 直接执行以下命令(如 trash-cli,用于稍后取消删除):

    find . -type f -name "*.html" -exec trash {}

  3. 直接使用便捷的操作(可靠:避免产生和竞争条件)

    find . -type f -name "*.html" -print0 -delete

解释:

  • -type f仅查找常规文件(不是目录d,不是符号链接)
  • -name像给定模式一样的名称的过滤器(也可以通过-or和替代进行扩展-regex
  • -print0打印找到的文件路径(用 NUL 分隔)
  • -exec trash {}执行给定的命令(这里垃圾) 以找到的文件作为参数(替换花括号)
  • -delete直接删除找到的文件(由于在同一进程中,因此性能良好,尽管与所有 find 版本并不兼容)

参见值得注意的警告:如何递归删除当前目录中特定扩展名的所有文件?

GNU 手册中的更多内容查找、删除文件

谨慎进行批量删除:Linux 没有内置的恢复删除功能

因此,在批量删除之前,请先检查发现的内容。因此,我建议采取安全措施。

  • 交互式代替强制选项:R M -i代替-f
  • 先列出或查找,然后检查,然后删除(例如通过附加管道或先运行寻找无任何行动)
  • 使用支持稍后撤消的垃圾文件夹工具:例如垃圾处理或者gvfs-垃圾

相关内容