AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 552743
Accepted
Codemonkey
Codemonkey
Asked: 2019-11-19 01:23:43 +0800 CST2019-11-19 01:23:43 +0800 CST 2019-11-19 01:23:43 +0800 CST

意外将数百万个文件写入(但随后删除)目录后,Bash 选项卡完成速度很慢

  • 772

前几天我遇到了一个脚本错误,将 400 万个小文本文件写入了我的主目录:

我不小心将 400 万个小文本文件写入了一个文件夹,如何最好地摆脱它们?

我删除了这些文件,但从那时起,每当我点击选项卡以完成文件名或路径时,在任何事情发生之前都会有半秒的延迟。

虽然文件现在已被删除,但我认为 gpt 或类似的东西有一些持久的损坏?有什么有用的工具可以用来清理它吗?

文件系统是 ext4(RAID 1 中有两个 3TB 驱动器),我运行的是 CentOS 7。

% ls -ld "$HOME"
drwx------. 8 myname myname 363606016 Nov 18 09:21 /home/myname 

谢谢

filesystems
  • 3 3 个回答
  • 121 Views

3 个回答

  • Voted
  1. Best Answer
    Stephen Kitt
    2019-11-19T05:20:11+08:002019-11-19T05:20:11+08:00

    如评论中所述,您的主目录本身很大,并且不会再次缩小。扫描主目录的内容将涉及每次(从缓存或磁盘)读取大量数据。

    要解决此问题,您需要重新创建主目录:

    • 注销,以 root 身份登录,并确保没有正在运行的进程引用您的主目录:

      lsof /home/myname
      
    • 复制你的主目录:

      cd /home
      cp -al myname myname.new
      
    • 重命名你的主目录:

      mv myname myname.old
      
    • 重命名您的新主目录:

      mv myname.new myname
      

    您现在可以重新登录。你闪亮的新主目录只会占用它真正需要的空间,文件操作应该和你期望的一样快。cp -al确保新目录下的所有文件都可用,但它使用硬链接,因此不会占用额外的空间(除了目录结构)。由于硬链接,对其中一个目录中的文件所做的任何更改都会反映在另一个目录中,但您可以安全地删除myname.old.

    类似的方法可用于任何曾经包含大量文件的目录,但在大多数其他情况下,您不需要先注销。

    • 7
  2. LustreOne
    2019-11-20T00:01:20+08:002019-11-20T00:01:20+08:00

    正如另一个答案中提到的,如果您可以轻松地重新创建目录,那么可以在不关闭系统的情况下完成此操作。

    在其他情况下,目录树中文件的数量或大小使得将它们复制到新目录变得更加困难,您还可以卸载文件系统(如果它是根文件系统,则从救援磁盘启动)并e2fsck -fD /dev/sdX运行优化目录的文件系统(-D选项)。这会将目录条目打包到最少数量的块中,而无需复制文件数据。

    • 2
  3. cas
    2019-11-23T17:42:57+08:002019-11-23T17:42:57+08:00

    Stephen Kitt 的回答基本上是正确的方法,但应该使用mv而不是cp- 无需花费几分钟或几小时复制所有文件,因为移动它们几乎不需要任何时间。例如:

    1. 以您的用户身份注销(所有登录实例,包括任何 ssh 会话)并以 root 身份登录。

      如果您的系统被配置为阻止直接 root 登录(例如,因为 root 有一个禁用的密码),请以不同的用户身份登录(如果需要,创建一个并授予它访问suor的权限sudo),然后获取一个 root shell。

    2. 不需要确保没有任何东西以您的用户身份运行或在您的主目录下打开文件,因为文件句柄(和 inode 编号)不会改变,除非您的主目录有自己的专用文件系统(例如,如果/home/username是它自己的挂载点,而不仅仅是 ) 的子目录/home。

      实际移动(在下面的步骤 3 中)应该只需要几分之一秒(取决于您的主目录顶层中的文件和目录的数量。这就是需要移动的全部内容),因为它是 a mv,而不是 a cp- 没有数据被复制,这一切都通过重命名很快完成。

      在这么短的时间内,任何东西都不太可能创建新文件(或尝试打开尚未移动的文件)。

      但是,如果你是偏执狂,或者如果一个或工作等可能会这样做,那么暂时禁用它们。记得之后重新启动它们。cronat

      对于任何其他可能执行此操作的正在运行的进程(例如 NFS 或 samba 或邮件传递或 ftpd 或其他)也是如此 - 现在杀死它们并稍后重新启动它们。顺便说一句,您可以杀死所有用户拥有的进程,例如pkill -u username.

    3. mv将主目录中的所有内容复制到新的主目录。例如,如果您的主目录是/home/username,请以 root 身份运行以下命令:

      cd /home
      mv username username.old
      mkdir username
      
      # move the files and subdirectories to the new home
      # BTW, using `find` ensures that "hidden" dotfiles and dotdirs are moved
      # along with the non-hidden files & dirs.
      cd username.old
      find . -mindepth 1 -maxdepth 1 -exec mv {} ../username/ +
      cd ..
      
      # fix ownership and perms of the new home dir
      gid="$(getent passwd username | cut -d: -f4)"
      perms="$(stat --printf "%a" username.old)"
      chown "username:$gid" username
      chmod "$perms" username
      
      rmdir username.old
      

    注意:stat --printf ...以上需要 GNU stat。你说你正在运行 Centos 7,所以这就是你所拥有的。

    对于在非 GNU 系统上遇到类似问题的任何人,您必须找到其他方法来复制烫发。FreeBSD 的版本stat具有类似的功能,但选项不同。或者只是手动设置新目录上的权限 - 它们很可能是775or 755(可能使用 set-gid,so 2775or 2755),但使用ls -ldorstat或其他方式验证。

    • 0

相关问题

  • 我应该在 NAS 的 SD 卡中使用哪个文件系统?

  • 如何提前知道 .zip 内部是否有父目录

  • Virtualbox 动态分配磁盘 *.vdi 不断增长

  • du/df 和 ls 报告不同的磁盘使用情况

  • Linux 内核开发人员如何处理数百万行代码的工作?他们是一种方法吗?[关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve