前言

很早之前在服务器上部署过一个微前端的项目,由于复杂度比较高导致 node_modules 过于庞大,当执行 rm -rf node_modules/ 之后发现有一个报错:

argument list too long

查询了一下发现原因是:删除文件中包含的小文件数量过多,受到 shell 参数个数限制,不能正常删除。
后面找了方案,发现可以通过 rsync 去快速删除大量文件。

省流版

# 以删除 logs 文件夹为例
# 创建一个空文件夹
mkdir -p /xxx/empty;
# 执行 rsync 同步空文件夹
rsync --delete-before -aO  /xxx/empty/ /xxx/logs/;

详细版

Linux 文件存储原理

Linux 文件存储数据是放在一张 inode 表,里面每一个文件的节点,每个节点包括以下内容:

  • 文件类型
  • 权限
  • UID,GID
  • i_nlink 链接数(指向这个文件名路径名称个数)
  • i_count 使用数(指使用这个文件的进程数)
  • 该文件的大小和不同的时间戳
  • 指向磁盘上文件的数据块指针
  • 有关文件的其他数据

Linux 文件真正删除的过程:

  • i_nlink=0 没有人进行链接使用,包括任何硬链接
  • i_count=0 没有任何进程使用

rm 原理

减少磁盘引用计数 i_nlink,就是减少其他文件对这个文件链接,实际并没有删除文件内容。
如果想要真正删除一个文件,还需要同时将 i_count 降至 0。

rsync 原理

rsync 本身是将两个文件夹作同步使用,使用 rsync 删除文件,步骤就是将一个空文件夹同步到要删除的文件夹里,这样就等于将文件夹清空了 :)