Debian - 删除数千个文件

Debian - 删除数千个文件

我的机器运行 Debian Squeeze,其中有 apache、mysql、php... 在其中一个目录中有一些其他目录和太多文件,超过 500k 个文件,我尝试通过 WinSCP 删除,但它挂了。即使超过 24 小时后,WinSCP 仍然没有响应。此刻我正尝试使用 Putty (rm -rf dirname) 删除此目录,但就像 WinSCP 一样,它变得没有响应。有什么建议吗?谢谢!

我有该机器的 root 访问权限。

答案1

删除目录应该可以。如果您尝试删除单个文件,可能会遇到麻烦,因为文件太多了。您不会在逃跑rm -rf dirname/*吧?

我猜你是因为不活动而丢失了 ssh 连接,你确定该命令未在服务器上正确执行吗?

无论如何,一个可能的解决方法是使用禁止

nohup rm -rf dirname

您可以启动该命令并注销,它将在后台继续运行。


更新:

我发现这个问题在 U&L.SE,我建议你看一下。不幸的是,我无法重现你的问题。我创建了一个包含 2516007 个文件的目录,并且始终可以使用以下命令删除它rm -rf

$ mkdir ha
$ for X in $(seq 1 10000);do touch {1..10000}_$X; done
$ ls -f ha | wc -l 
  2516007     <= I stopped before the for loop finished, but this should be enough
$ time rm -rf ha/
  real  23m11.695s
  user  0m3.540s
  sys           0m42.891s

因此,删除约 200 万个空文件需要 20 分钟。删除大量非空文件可能需要几个小时,这似乎是合理的。

无论如何,U&L 问题中的一些建议应该会有所帮助。特别是这个:

find /delb -type f  --delete

或者这个(与原文略有修改)

find /delb -type f -print0 | xargs -0r rm -f

最后,您可以使用的一个技巧是一次删除几个文件。如果您知道某些文件名以字符串“foo”开头,其他文​​件名以“bar”开头等,请执行以下操作:

rm -rf /delb/foo*
rm -rf /delb/bar*

等等。你也可以尝试以下方法:

for n in {a..z}; do rm -rf /delb/$n*; done
for n in {A..Z}; do rm -rf /delb/$n*; done
for n in {0..9}; do rm -rf /delb/$n*; done

最后一个命令将依次删除以字母表中每个字母开头的每个文件名,然后删除以数字开头的每个文件名。

答案2

顺便说一下,我已经发布了答案。根据我处理文件系统用尽 inode 的经验。文件系统上有超过十亿个文件。

删除/列出文件的最快方法是使用 find,尤其是当您有数千个文件/目录时。只要没有扩展需要执行,Find 就会立即开始工作。

查找 /path/to/be/deleted -type f --delete

不要使用*或任何其他类型的命令行扩展作为命令的一部分。*在传递给命令 rm / ls 等之前在终端中执行。因此,您的终端会尝试列出所有十万个文件,然后再将它们传递给实际执行工作的命令。这非常慢。

man bash
... 扩展 在将命令行拆分为单词后,将执行扩展。执行的扩展有七种:括号扩展、波浪号扩展、参数和变量扩展、命令替换、算术扩展、单词拆分和路径名
扩展 。...

相关内容