前几天我遇到了一个脚本错误,将 400 万个小文本文件写入了我的主目录:
我不小心将 400 万个小文本文件写入了一个文件夹,如何最好地摆脱它们?
我删除了这些文件,但从那时起,每当我点击选项卡以完成文件名或路径时,在任何事情发生之前都会有半秒的延迟。
虽然文件现在已被删除,但我认为 gpt 或类似的东西有一些持久的损坏?有什么有用的工具可以用来清理它吗?
文件系统是 ext4(RAID 1 中有两个 3TB 驱动器),我运行的是 CentOS 7。
% ls -ld "$HOME"
drwx------. 8 myname myname 363606016 Nov 18 09:21 /home/myname
谢谢
如评论中所述,您的主目录本身很大,并且不会再次缩小。扫描主目录的内容将涉及每次(从缓存或磁盘)读取大量数据。
要解决此问题,您需要重新创建主目录:
注销,以 root 身份登录,并确保没有正在运行的进程引用您的主目录:
复制你的主目录:
重命名你的主目录:
重命名您的新主目录:
您现在可以重新登录。你闪亮的新主目录只会占用它真正需要的空间,文件操作应该和你期望的一样快。
cp -al
确保新目录下的所有文件都可用,但它使用硬链接,因此不会占用额外的空间(除了目录结构)。由于硬链接,对其中一个目录中的文件所做的任何更改都会反映在另一个目录中,但您可以安全地删除myname.old
.类似的方法可用于任何曾经包含大量文件的目录,但在大多数其他情况下,您不需要先注销。
正如另一个答案中提到的,如果您可以轻松地重新创建目录,那么可以在不关闭系统的情况下完成此操作。
在其他情况下,目录树中文件的数量或大小使得将它们复制到新目录变得更加困难,您还可以卸载文件系统(如果它是根文件系统,则从救援磁盘启动)并
e2fsck -fD /dev/sdX
运行优化目录的文件系统(-D
选项)。这会将目录条目打包到最少数量的块中,而无需复制文件数据。Stephen Kitt 的回答基本上是正确的方法,但应该使用
mv
而不是cp
- 无需花费几分钟或几小时复制所有文件,因为移动它们几乎不需要任何时间。例如:以您的用户身份注销(所有登录实例,包括任何 ssh 会话)并以 root 身份登录。
如果您的系统被配置为阻止直接 root 登录(例如,因为 root 有一个禁用的密码),请以不同的用户身份登录(如果需要,创建一个并授予它访问
su
or的权限sudo
),然后获取一个 root shell。不需要确保没有任何东西以您的用户身份运行或在您的主目录下打开文件,因为文件句柄(和 inode 编号)不会改变,除非您的主目录有自己的专用文件系统(例如,如果
/home/username
是它自己的挂载点,而不仅仅是 ) 的子目录/home
。实际移动(在下面的步骤 3 中)应该只需要几分之一秒(取决于您的主目录顶层中的文件和目录的数量。这就是需要移动的全部内容),因为它是 a
mv
,而不是 acp
- 没有数据被复制,这一切都通过重命名很快完成。在这么短的时间内,任何东西都不太可能创建新文件(或尝试打开尚未移动的文件)。
但是,如果你是偏执狂,或者如果一个或工作等可能会这样做,那么暂时禁用它们。记得之后重新启动它们。
cron
at
对于任何其他可能执行此操作的正在运行的进程(例如 NFS 或 samba 或邮件传递或 ftpd 或其他)也是如此 - 现在杀死它们并稍后重新启动它们。顺便说一句,您可以杀死所有用户拥有的进程,例如
pkill -u username
.mv
将主目录中的所有内容复制到新的主目录。例如,如果您的主目录是/home/username
,请以 root 身份运行以下命令:注意:
stat --printf ...
以上需要 GNU stat。你说你正在运行 Centos 7,所以这就是你所拥有的。对于在非 GNU 系统上遇到类似问题的任何人,您必须找到其他方法来复制烫发。FreeBSD 的版本
stat
具有类似的功能,但选项不同。或者只是手动设置新目录上的权限 - 它们很可能是775
or755
(可能使用 set-gid,so2775
or2755
),但使用ls -ld
orstat
或其他方式验证。