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

介绍

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

这次,我被要求从客户的服务器上删除文件,但是文件太多,一个一个地删效率太低!我将介绍用删除文件的方法

如果能掌握它的使用方法,那当然很方便,但如果犯了错误,可能会发生可怕的事情,比如完全擦除其他部分,所以我希望练习使用它,以免发生可怕的事情!

此外,还有许多其他关于 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 [文件类型]
文件类型- 您可以通过在类型后添加 f(普通文件)或 d(目录)来指定类型。
-mtime[天数] 搜索指定天数内
-atime[天数]" 搜索指定天数前
-newermt[日期和时间]” 搜索在指定日期和时间之后

如何在操作中指定删除

这里的操作的是
处理方法这次我想重点介绍删除处理方法,所以我想用 rm 命令来介绍删除处理方法

简而言之,删除文件的方法有很多种。
这次,我们创建了一个表格,比较了“ | xargs rm -p ”、“ -exec rm {} + ”和“ -exec rm {} \; ”这三种方法,它们用于将使用 find 命令指定的多个文件传递给 rm 命令以删除它们。

行动 处理方法 命令说明 如何处理参数
| xargs -p rm 由于 rm 命令一次可以删除多个文件,因此只需执行一次
→ 即使删除大量文件,处理速度也很快
“xargs”不是一个选项,而是一个单独的命令
→ 你可以通过用“|”连接多个命令来使用它。
空白字符(空格、换行符等)会被识别为参数分隔符
。如果路径中包含空格,则可能无法正确识别。
-exec 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”,而“ 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日。
ls 命令而不是 rm 命令可以找到
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 日

,运行命令,但这次指定使用
ls而不是 rm 系统会询问“是否运行 ls?”。如果输入“y”,则会显示要删除的文件。
您可以确认已找到 2024 年 12 月 6 日到 2024 年 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. 删除文件

现在我们来删除它。
lsrm并运行该命令。系统会询问你是否要删除它,输入 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 命令搜索文件和目录,
7 条规则 + 实用知识,轻松理解 find 命令的用法
,find -exec 和 find | xargs 的区别

如果您觉得这篇文章有用,请点击【点赞】!
8
加载中...
8票,平均分:1.00/18
4,044
X Facebook Hatena书签 口袋

这篇文章的作者

关于作者

帕鲁

24岁,系统解决方案部门毕业生。
我未来的梦想是租一间稍微大一点的房间,再养一只猫。