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

目录
介绍
大家好,我是Paru,系统解决方案部门的一名一年级基础设施工程师,2024年毕业。
转眼间,新年就到了,加入Beyond也快一年了。时间过得真快,让我有点不知所措。
这次,我被要求从客户的服务器上删除文件,但是文件太多,一个一个地删效率太低!我将介绍用删除文件的方法。
如果能掌握它的使用方法,那当然很方便,但如果犯了错误,可能会发生可怕的事情,比如完全擦除其他部分,所以我希望练习使用它,以免发生可怕的事情!
此外,还有许多其他关于 Linux 入门命令的文章,如果您感兴趣,请浏览一下。
[Linux] 命令行中的“~”、“$”和“#”符号分别代表什么意思?[面向初学者]
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_1 、 file_2和file_3
如果您使用“ -exec FileDeleter.exe {} + file_1 、 file_2和file_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