Linux如何快速删除大量的文件

在linux环境中,我们会遇到需要删除很多文件的操作,那我们该如何快速删除文件里面的内容,比如删除10W个文件!

rm -rf *

相信很多人都会用这条命令去删除文件夹内部的文件,但是需要删除10W个文件,会提示报错:

Linux如何快速删除大量的文件.png

极其重要的警告​:在你运行包含rm命令的脚本或命令行之前,请务必再三确认你的命令是正确的。一旦执行,被删除的文件就无法恢复了。

find

有人说我们可以使用find命令将文件全部查出来去删除,这个办法可行,我们测试一下!

# 查找当前目录下面所有以 .txt 结尾的文件并使用rm删除
find . -type f -name "*.txt" -exec rm {} +

PS:执行之后我们会发现,删除需要的时间会很久很久,无法达到快速删除的效果!

这里是命令的详细解释:

  • . 表示从当前目录开始查找。
  • -type f 表示查找的类型为文件。
  • -name "*.txt" 定义了要查找的文件名。
  • -exec 后面跟的是对找到的每个文件执行的命令,在这里是rm
  • {} 是一个占位符,代表find命令找到的每个文件名。
  • + 表示将查找到的所有文件作为rm命令的参数。

极其重要的警告​:在你运行包含rm命令的脚本或命令行之前,请务必再三确认你的命令是正确的。一旦执行,被删除的文件就无法恢复了。为了避免意外删除文件,你可以先运行find命令而不带-exec rm {} +部分,以查看哪些文件会被找到。确认之后再添加-exec rm {} +来删除文件。

for 循环

我们也可以使用find命令和for循环结合将文件查出来挨个去删除,这个办法可行,我们测试一下!

# 循环查找当前目录的所有文件并逐一删除
for file in $(find . -type f -name "*.txt"); do
    echo "正在删除文件: $file"
    rm "$file"  # 删除当前遍历到的文件
done

正在删除文件: ./1.txt
正在删除文件: ./2.txt

PS: 以上方法效率都非常低,耗费时间特别长!

rsync

原本是用来同步数据使用的命令,但我们可以把它当做一种比较快速且高效,还能保留原有文件的删除命令!

# 将我们的需要删除的文件列表导入到一个文件内,这里面存放不需要删除的文件名称
ls -l -f > /tmp/fileslist.txt

# 创建一个空目录
mkdir /tmp/aaa

# 执行同步命令

rsync -av --delete /tmp/aaa/ /root/files/ --exclude-from=/tmp/fileslist.txt

这里是命令的详细解释:

  • rsync 是一个强大的工具,用于在Linux/Unix系统中同步文件和目录。它可以通过网络(使用SSH或rsync守护进程)或在本地文件系统中进行同步。
  • -av 是两个选项的组合:
    • -a(或 --archive)是归档模式,它保证了文件的复制是递归的,并且尽可能保持原文件的属性,如时间戳、文件权限、软硬链接等。
    • -v(或 --verbose)提高了命令的冗余级别,使其在执行时输出更多的信息。
  • --delete 选项在同步过程中删除那些存在于目的地(/root/files/)而不在源目录(/tmp/aaa/)中的文件。这保证了目的地目录是源目录的精确镜像。
  • /tmp/aaa/ 是源目录,rsync将从这里复制文件。
  • /root/files/ 是目标目录,rsync将文件同步到这里。
  • --exclude-from=/tmp/fileslist.txt 指定一个文件,该文件内列出了在同步过程中需要排除的文件或目录模式。简而言之,/tmp/fileslist.txt文件中列出的任何文件或目式都不会被复制到目的地目录。