Debian - 删除数千个文件

skl*_*klr 6 linux debian

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

我对机器有 root 访问权限。

ter*_*don 4

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

我的猜测是,您由于不活动而失去了 ssh 连接,您确定该命令未在服务器上正确执行吗?

无论如何,可能的解决方法是使用nohup

nohup rm -rf dirname
Run Code Online (Sandbox Code Playgroud)

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


更新:

我在 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
Run Code Online (Sandbox Code Playgroud)

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

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

find /delb -type f  --delete
Run Code Online (Sandbox Code Playgroud)

或这个(在原来的基础上稍作修改)

find /delb -type f -print0 | xargs -0r rm -f
Run Code Online (Sandbox Code Playgroud)

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

rm -rf /delb/foo*
rm -rf /delb/bar*
Run Code Online (Sandbox Code Playgroud)

等等。你也可以尝试这样的事情:

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
Run Code Online (Sandbox Code Playgroud)

最后一条命令将按顺序删除以字母表中的每个字母开头的每个文件名,然后删除以数字开头的所有文件名。