用特定的扩展名递归删除文件
1. 概述
作为 Linux 系统上的系统管理员,我们可以花很多时间清理。这通常包括在目录树中递归地查找和删除文件。
在本教程中,我们将介绍几种基于文件“扩展名”或文件名模式删除批量文件的方法。我们还将讨论避免批量删除的一些常见陷阱的方法。
2. 警告
当我们在 Linux 上通过 CLI 删除文件时,它就永远消失了。因此,当我们使用一个命令删除多个文件时,我们应该遵守几个最佳实践。
首先,我们应该验证我们正在删除正确的文件。为了帮助解决这个问题:
- 我们可能会使用pwd来检查我们当前的目录,或者验证我们的文件路径是否正确
- 我们应该通过使用ls列出和查看文件来验证我们只删除了我们想要删除的内容
- 我们可能会在不启用删除部分的情况下使用命令预览哪些文件将被删除
其次,我们应该考虑在删除之前对目录进行备份。Linux tar 命令对于备份目录很有用。
3. 验证和备份文件
对于我们的示例,假设我们正在使用 Emacs 文本编辑器编辑一些文本文件。Emacs 会为每个编辑过的文件创建一个备份,并在其文件名的末尾添加一个“~”(波浪号)字符。编辑完一些文本文件后,我们要删除所有以“ *.txt~”*结尾的文件。
对于我们所有的删除示例,我们将使用 Linux find 命令来识别要删除的所有文件。 find是 Linux 中最流行和最有效的文件搜索工具。
3.1. 验证位置
让我们首先使用pwd检查我们是否在正确的位置:
$ pwd
/tmp/d
3.2. 查找和验证文件
现在,让我们通过编写将找到它们的find命令并使用它来列出它们而不是删除它们来仔细检查我们要删除的文件:
$ find . -type f -name '*.txt~' -print
./john.txt~
./middle/ieou.txt~
./b.txt~
./left/u.txt~
./left/up/asdf.txt~
./left/t.txt~
./left/down/kjhl.txt~
./a.txt~
在这里,我们使用选项*-type f*来选择文件, -name ‘*.txt~’来匹配文件名,-print来将文件名回显到终端。
3.3. 备份文件
接下来,让我们使用tar 备份目录。这不是必需的步骤,但我们应该进行备份,除非我们 100% 确定我们有正确的文件要删除:
$ tar -cf backup.tar .
要查看 tar 正在备份的文件列表,我们可以添加 -v选项:
$ tar -cvf backup.tar .
4. 使用find -delete删除文件
删除文件的最简单方法是告诉find为我们删除它们。我们可以使用 -name选项和find来指定一个glob 表达式 。在以下示例中,我们使用 glob 表达式来搜索具有特定扩展名的文件。正如我们从手册页 中看到的那样,通配符对于查找不仅仅是文件扩展名非常有用。
$ find . -type f -name '*.txt~' -print -delete
./john.txt~
./middle/ieou.txt~
./b.txt~
./left/u.txt~
./left/up/asdf.txt~
./left/t.txt~
./left/down/kjhl.txt~
./a.txt~
为了使用 find 删除文件,我们只需在find命令的末尾 添加-delete 。**
或者,如果我们不想在删除文件时打印文件:
$ find . -type f -name '.txt*~' -delete
5. 使用find -exec删除文件
假设我们需要使用带有一些附加选项的rm或不同的命令(例如垃圾 )来删除文件:
$ find . -type f -name '*.txt~' -exec rm -f {} \;
或者:
$ find . -type f -name '*.txt~' -exec trash {} \;
使用find和 -exec 允许我们使用任何命令和选项来删除文件。它还允许我们对一组文件进行其他批量操作。
6. 使用find和xargs删除文件
最后,我们可能会发现我们的发行版为我们提供了不支持 -delete选项的find命令版本。在这种情况下,我们可以将 find与 *xargs *一起使用:
$ find . -name "*.txt~" -print0 | xargs -0 rm
当我们使用xargs时,使用空终止符很重要,这样我们就不会遇到文件名中的空格问题。