Linux中删除文件的命令及其示例用法

在 Linux 中删除文件,最常用的命令是 rm 命令。让我们看一些 rm 命令的例子。

[root@rumenz ~]# rm -f testfile

-f在上面的命令中使用,将在不要求确认的情况下强行删除文件。

[root@rumenz ~]# rm -rf testdirectory

上述命令将删除名为 testdirectory 的目录  以及该目录中的所有内容(使用的-r选项是递归删除文件)

[root@rumenz ~]# rmdir testdirectory

上面的命令 rmdir,只有在目录为空时才会删除该目录。

现在让我们看看在 Linux 中删除文件的一些不同方法。我最常用方法之一是使用find命令。可用于根据文件的类型、大小、创建日期、修改日期和更多不同的条件来搜索文件。

[root@rumenz /]# find /test -type f -exec rm {} \;

上面显示的命令将删除 /test 目录中的所有文件。首先 find 命令将查找目录中的所有文件,然后对于每个结果,它会执行和 rm。

让我们看看可以与 find 命令一起使用的一些不同方法来删除文件。

[root@rumenz /]# find /test -mtime +7 -exec rm {} \;

在上面显示的示例中,find 命令将搜索 /test 目录中 7 天前修改过的所有文件,然后删除每个文件。

[root@rumenz /]# find /test -size +7M -exec rm {} \;

上图示例,将搜索目录/test 中所有大于7M 的文件,然后删除每个文件。

在上面显示的所有 find 命令示例中,都会为列表中的每个文件调用 rm 命令。例如,在上图的最后一个find命令中,如果结果是60个大于7M的文件,则调用60个rm命令删除每个文件。这将需要更长的时间。

除了在 find 中借助 -exec 参数使用 rm 的上述命令外,还有一个更好的选择。我们将看到替代方案,然后计算每个方案的速度差异。

批量生成60万个文件

[root@rumenz test]# for i in $(seq 1 600000); do echo testing >> $i.txt; done

上述命令将 在当前工作目录中 创建 60 万个文件(半百万),名称从 1.txt 到 600000.txt,每个文件都包含文本testing,因此文件大小至少在几千字节的范围。现在让我们测试使用不同命令删除这些数量的文件的速度。首先让我们使用简单的 rm 命令,然后将使用带有 -exec 和 delete 选项的 find 命令来计算删除这些文件所需的时间。

[root@rumenz test]# time rm -f *
-bash: /bin/rm: Argument list too long
real    0m11.126s
user    0m9.673s
sys     0m1.278s

如果你看到我在 test 目录上运行的上述 rm 命令,其中包含 60 万个文件,它会给我一条消息说/bin/rm: Argument list too long。这意味着该命令没有完成删除,因为给 rm 命令的文件数量太大而无法完成。

使用find rm删除

现在让我们使用我们之前看到的带有 -exec 参数的 find 命令。

[root@rumenz test]# time find ./ -type f -exec rm {} \;
real    14m51.735s
user    2m24.330s
sys     9m48.743s

rm 用时14 分 51 秒

使用find delete删除

现在让我们通过在 find 命令中使用-delete选项来测试消耗的时间。

[root@rumenz test]# time find ./ -type f -delete
real    5m11.937s
user    0m1.259s
sys     0m28.441s
[root@rumenz test]#

-delete 选项只用了5分11秒

使用perl删除

[root@rumenz test]# time perl -e 'for(<*>){((stat)[9]<(unlink))}'
real    1m0.488s
user    0m7.023s
sys     0m27.403s

Perl 只用了大约1分钟就删除了该目录中的60万个文件。但是要对 Perl 正则表达式有一定的了解。

使用rsync删除文件

在我们的例子中test目录有 60 万个文件,让我们创建一个名为blanktest的目录,为了简单的同步,它将保持为空。现在,我们将在 rsync 中使用 -delete 选项,这将删除目标目录中的所有文件,这些文件在源中不存在(在我们的例子中,源是一个空目录,所以在目标目录将被删除。)

空目录home/blanktest,要清空/test目录

[root@rumenz home]# time rsync -a --delete blanktest/ test/
real    2m52.602s
user    0m2.772s
sys     0m32.649s

因此与 find 命令相比,如果你想清空包含数百万个文件的目录,使用 rsync效果最好。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐