[Linux] 我想使用 find 命令一次性删除服务器上的所有文件!

介绍

大家好,我是Paru,系统解决方案部门的一名一年级基础设施工程师,2024届毕业生。
转眼间,新年就到了,加入Beyond也快一年了。时间过得真快,我都有点害怕了!⛄

,但文件太多,一个一个删除效率太低!分享如何使用 Linux 命令“find”删除文件。上的删除要求

如果能熟练掌握就很方便,但一步走错可能会抹掉整个部分,这很可怕,所以我要练习使用它,避免任何可怕的经历!

此外,还有许多其他关于 Linux 入门命令的文章,如果您感兴趣,请浏览一下。

[Linux] 命令行中的“~”、“$”和“#”符号分别代表什么意思?[面向初学者]

[Linux] "ll" 不是一个命令

find 命令是什么?

基本格式

首先,`find` 命令是搜索文件和目录的命令
可以指定多个文件和目录作为搜索目标。

find 命令的基本格式如下:

查找 [搜索路径] [选项] [操作]

实际应用后,效果如下。

查找 /var/log/test_log -name "file_1"-打印

上述命令指定 /var/log/test_log 下的文件名(-name "file_1"),并显示列表(-print)。

由于命令可以根据需要进行任意修改,因此某些命令看起来可能复杂难用,但其基本格式其实非常简单。我们将在下一节详细介绍选项和操作。

选项示例

我们还将介绍 `find` 命令的各种选项。
虽然还有很多其他选项,但本文主要列出基本选项和必要的命令。

选项 解释
-name "[文件名]" 指定文件名通过
-iname "[文件名]" 文件名(不区分大小写)。
-路径[文件名]" 通过指定路径名称的子字符串或特定模式来搜索
-ipath "[filename]" 使用路径名称的子字符串或特定模式(不区分大小写)搜索匹配项。
-type [文件类型] 文件类型你可以通过指定
——你可以在“type”后面添加“f”(表示普通文件)或“d”(表示目录)来指定类型。
-mtime[天数] 在指定天数之前更新的文件。搜索
-atime[天数]" 在指定天数之前访问过的文件。搜索
-newermt[日期和时间]” 自指定日期和时间以来已更新的文件

如何在操作中指定删除

在此“操作”处理方法指的是
这次,我们想重点介绍删除方法,因此如何使用 `rm` 命令删除文件我将介绍

即使只是简单地删除文件,也可以使用多种方法。
——作为示例,这些命令用于将 find 命令指定的多个文件传递给 rm 命令进行删除| xargs rm -p”、“-exec rm {} +”和“-exec rm {} \;,并在表格中对它们进行比较。

行动 处理方法 命令说明 如何处理参数
| xargs -p rm 由于多个文件一次性传递给 `rm`,因此 `rm` 只执行一次
→ 即使删除大量文件,处理速度也很快。
“xargs”不是一个选项;它是一个单独的命令
,可以通过用“|”连接与其他各种命令一起使用。
空白字符(空格、换行符等)被识别为参数分隔符
→ 如果路径中有空格,则可能无法正确识别。
-exec rm {} + 由于多个文件一次性传递给 `rm`,因此 `rm` 只执行一次
→ 即使删除大量文件,处理速度也很快。
“-exec”是find命令的一个选项
→它不能与其他命令一起使用。
参数是固定的
→ 即使路径中有空格,参数也会被识别为一个整体。
-exec rm {} \; 由于多个文件是逐个传递给 `rm` 的,因此 `rm` 会针对每个文件执行一次
→ 删除大量文件会变得缓慢且消耗资源。
“-exec”是find命令的一个选项
→它不能与其他命令一起使用。
参数是固定的
→ 即使路径中有空格,参数也会被识别为一个整体。

我只是粗略地总结了一下,但是看看这张表格,-exec rm -i {} \;”的处理时间比“-exec rm {} +你不觉得

虽然它肯定不适合删除大量文件之类的任务,但“假定参数数量固定的命令和程序对于-exec ~ {} \;

例如,FileDeleter.exe假设我们创建一个名为
该程序可以像rm命令一样执行删除操作,但它接受一个参数
使用该程序和find命令file_1file_2file_3 假设我们想

-exec FileDeleter.exe {} +使用 file_1file_2file_3 传递FileDeleter.exe只能接受一个参数的
相反,使用“-exec FileDeleter.exe {} \;逐个FileDeleter.exe,因此可以正确执行。

这里我们将使用的 `rm` 命令可以接受可变数量的参数,只要参数数量不超过最大值即可。
但是,有些程序,例如“FileDeleter.exe”,其设计假定参数数量是固定的。
在这种情况下,您可能会遇到 `-exec ~ {} +` 不起作用,但 `-exec ~ {} \;` 肯定可以执行的情况。
因此,根据要对目标参数执行的处理类型来选择使用哪种操作您需要

我之前详细讲解过“-exec”命令,但
它可以高效地删除多个文件,并且可以与其他命令结合使用xargs 来执行文件删除操作。(我想掌握这些易于使用的命令!✊)

尝试使用 find 命令删除该文件。

删除前

这次,我们将使用以下命令格式执行删除操作。

find [搜索目标路径] -type [类型] [选项] '[天数或日期和时间]' | xargs -p rm

` xargs`命令接受参数(在本例中为要删除的文件或目录),并将它们一次性传递给命令(在本例中为 `rm`)。`
选项-p`会显示一个确认提示。您必须对“是否要删除?”的确认信息回答 `y`,否则文件将不会被删除,因此最好始终包含此选项。

顺便一提,如果要删除指定路径下的所有目录,rm-r需要
不过,由于我们这里只删除文件,所以就不添加这个选项了。

最后也是最重要的一点,为了安全起见, 请在删除文件之前尝试运行“ls”命令而不是“rm”命令。
如果您正确输入了命令,它将查找并显示相关文件,从而防止误删。

删除早于指定日期和时间的文件

咱们来实际试一试。

1. 创建文件

我创建了以下文件。
这次, 想删除所有在2024年12月5日之前更新的文件

[root@localhost test_log]# ll /var/log/test_log 总计 0 -rw-r--r--. 1 root root 0 2024年12月1日 file_1 -rw-r--r--. 1 root root 0 2024年12月2日 file_2 -rw-r--r--. 1 root root 0 2024年12月3日 file_3 -rw-r--r--. 1 root root 0 2024年12月4日 file_4 -rw-r--r--. 1 root root 0 2024年12月5日 file_5 -rw-r--r--. 1 root root 0 2024年12月6日 file_6 -rw-r--r--. 1 root root 0 2024年12月7日 file_7 -rw-r--r--. 1 root root 0 2024年12月8日 file_8 -rw-r--r--. 1 root root 0 2024年12月9日 file_9

2. 检查要删除的文件

选项“!-newermt”并指定日期为2024年12月5日。
而不是rm命令 ls命令 2024年12月1日至12月4日之间更新的文件(file_1至file_4)是否存在
当系统询问“是否运行ls?”时,输入“y”,即可显示要删除的文件。

[root@localhost ~]# find /var/log/test_log -type f ! -newermt 'Dec 5 2024' | xargs -p ls ls /var/log/test_log/file_2 /var/log/test_log/file_3 /var/log/test_log/file_4 /var/log/test_log/file_1?...y /var/log/test_log/file_1 /var/log/test_log/file_2 /var/log/test_log/file_3 /var/log/test_log/file_4

3. 删除文件

确认要删除的文件后,就可以执行删除操作了。
`ls` `rm` 并执行该命令。系统会询问“是否要删除?”,y输入

[root@localhost ~]# find /var/log/test_log -type f ! -newermt 'Dec 5 2024' | xargs -p rm rm /var/log/test_log/file_1 /var/log/test_log/file_2 /var/log/test_log/file_3 /var/log/test_log/file_4?...y

4. 检查文件

文件已成功删除。
您可以确认,2024年12月5日之前更新的文件已被删除。

[root@localhost test_log]# ll /var/log/test_log 总计 0 -rw-r--r--. 1 root root 0 12月 5 2024 file_5 -rw-r--r--. 1 root root 0 12月 6 2024 file_6 -rw-r--r--. 1 root root 0 12月 7 2024 file_7 -rw-r--r--. 1 root root 0 12月 8 2024 file_8 -rw-r--r--. 1 root root 0 12月 9 2024 file_9

在指定日期和时间之后删除文件

接下来, 想删除 2024 年 12 月 5 日之后更新的所有文件

1. 创建文件

我像之前一样创建了文件。

[root@localhost test_log]# ll /var/log/test_log 总计 0 -rw-r--r--. 1 root root 0 2024年12月1日 file_1 -rw-r--r--. 1 root root 0 2024年12月2日 file_2 -rw-r--r--. 1 root root 0 2024年12月3日 file_3 -rw-r--r--. 1 root root 0 2024年12月4日 file_4 -rw-r--r--. 1 root root 0 2024年12月5日 file_5 -rw-r--r--. 1 root root 0 2024年12月6日 file_6 -rw-r--r--. 1 root root 0 2024年12月7日 file_7 -rw-r--r--. 1 root root 0 2024年12月8日 file_8 -rw-r--r--. 1 root root 0 2024年12月9日 file_9

2. 检查要删除的文件

这次,-newermt我们将指定
指定日期和时间的难点在于,“!-newermt会搜索排除指定日期和时间的文件,而“-newermt包含指定日期和时间的则会搜索
因此,如果您想删除 2024 年 12 月 5 日之后更新的文件, 2024 年 12 月 6 日 则必须指定

而不是 `rm` `ls` 命令 命令,并执行该命令。
当系统询问“是否运行 `ls` 命令?”时,输入“y”,即可显示要删除的文件。
已找到 2024 年 12 月 6 日到 12 月 9 日之间更新的文件(file_6 到 file_9)

[root@localhost ~]# find /var/log/test_log -type f -newermt 'Dec 6 2024' | xargs -p ls /var/log/test_log/file_6 /var/log/test_log/file_7 /var/log/test_log/file_8 /var/log/test_log/file_9?...y /var/log/test_log/file_6 /var/log/test_log/file_7 /var/log/test_log/file_8 /var/log/test_log/file_9

3. 删除文件

现在,我们来删除它。
`ls` `rm` 并执行该命令。系统会询问“是否要删除?”,y输入

[root@localhost ~]# find /var/log/test_log -type f -newermt 'Dec 6 2024' | xargs -p rm rm /var/log/test_log/file_6 /var/log/test_log/file_7 /var/log/test_log/file_8 /var/log/test_log/file_9?...y

4. 检查文件

您可以看到,2024/12/5 之后创建的文件已经消失了。

[root@localhost test_log]# ll /var/log/test_log 总计 0 -rw-r--r--. 1 root root 0 12月 1 2024 file_1 -rw-r--r--. 1 root root 0 12月 2 2024 file_2 -rw-r--r--. 1 root root 0 12月 3 2024 file_3 -rw-r--r--. 1 root root 0 12月 4 2024 file_4 -rw-r--r--. 1 root root 0 12月 5 2024 file_5

补充说明:我想更详细地说明一下。

如果我把每个步骤都写出来,篇幅会太长,所以我就到此为止吧。

最后,我想介绍一个命令,用于仅删除指定日期和时间的文件。
假设您的文件结构类似于下面的示例,并且您只想删除 12 月 3 日至 12 月 7 日的文件:

[root@localhost test_log]# ll /var/log/test_log 总计 0 -rw-r--r--. 1 root root 0 2024年12月1日 file_1 -rw-r--r--. 1 root root 0 2024年12月2日 file_2 -rw-r--r--. 1 root root 0 2024年12月3日 file_3 -rw-r--r--. 1 root root 0 2024年12月4日 file_4 -rw-r--r--. 1 root root 0 2024年12月5日 file_5 -rw-r--r--. 1 root root 0 2024年12月6日 file_6 -rw-r--r--. 1 root root 0 2024年12月7日 file_7 -rw-r--r--. 1 root root 0 2024年12月8日 file_8 -rw-r--r--. 1 root root 0 2024年12月9日 file_9

使用与之前相同的方法,您可以使用“-newermt”选项指定日期,例如:“-newermt "2024年12月3日" ! -newermt "2024年12月8日"”。这样可以更灵活地指定日期,因此可能很有用。
供您参考!

[root@localhost test_log]# find /var/log/test_log -type f -newermt "Dec 3 2024" ! -newermt "Dec 8 2024" | xargs -p rm rm /var/log/test_log/file_5 /var/log/test_log/file_3 /var/log/test_log/file_4 /var/log/test_log/file_6 /var/log/test_log/file_7?...y [root@localhost test_log]# ll /var/log/test_log total 0 -rw-r--r--. 1 root root 0 Dec 1 2024 file_1 -rw-r--r--. 1 root root 0 Dec 2 2024 file_2 -rw-r--r--. 1 root root 0 2024年12月8日 file_8 -rw-r--r--. 1 root root 0 2024年12月9日 file_9

概括

你觉得怎么样?

这次我主要学习了如何使用 find 命令删除文件,但 find 命令用途广泛,非常方便,所以我还会继续学习,争取熟练掌握它 🔥

感谢您阅读到最后!

参考网站:
什么是 find 命令?使用 Linux 命令搜索文件和目录的指南。
轻松理解 find 命令使用的 7 条规则 + 实用技巧。find
-exec 和 find | xargs 的区别。

如果您觉得这篇文章对您有帮助,请点个“赞”!
9
加载中...
9票,平均分:1.00/19
4,824
X Facebook Hatena书签 口袋

这篇文章的作者

关于作者

帕鲁

2024年毕业于系统解决方案系。
我未来的梦想是租一间稍微大一点的房间,再养一只猫。