前言
很早之前在服务器上部署过一个微前端的项目,由于复杂度比较高导致 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 删除文件,步骤就是将一个空文件夹同步到要删除的文件夹里,这样就等于将文件夹清空了 :)