我需要删除所有 *.html 文件。但是,我有一个父文件夹,里面有很多子文件夹,每个子文件夹中都有一个 HTML 文件。我可以通过访问每个子文件夹来删除文件。但是,我需要直接从父文件夹中删除每个 HTML 文件
答案1
最简单的方法是:
find . -type f -name '*.html' -delete
从您想要启动它的目录执行此操作。
find
是搜索某些内容的命令.
表示从您当前所在的目录f
表示仅搜索文件(d
针对目录)- 并搜索
name
结尾为.html
- 并且 find 有一个选项
delete
可以
答案2
在为您提供粘贴并运行的解决方案之前,我想解释一下 Linux Shell 的一些最佳实践和自动化模式。相同的概念也适用于其他 IT 领域:
- 分而治之:将问题拆分成(独立的)部分以便于解决
- 关注点分离:此处删除为命令;查找为查询(CQRS)
- 管道和过滤器:链中最佳工具的组合
预览和管道解释
虽然下面的方法不适用于子目录(递归),但它说明了一种组合命令的安全和模块化方法。
a)简单列出并删除(操作前先预览):
列出所有 HTML 文件(仅列出,不递归)
ls *.html
然后移除
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
直接删除(危险):
rm **/*.html
这种直接删除命令很危险,因为一个小小的拼写错误就会产生不利影响。例如,如果意外插入一个空格,rm *.html
它将变成rm * .html
。不幸的是,它将删除所有文件,并可能打印未找到第二条路径“.html”的错误。
合并:查找并删除
查找(在目录层次结构中搜索文件)并删除
使用管道(符合 POSIX 标准:可在更多系统上运行)
find . -type f -name "*.html" | xargs -r0 rm
直接执行以下命令(如 trash-cli,用于稍后取消删除):
find . -type f -name "*.html" -exec trash {}
直接使用便捷的操作(可靠:避免产生和竞争条件)
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-垃圾