从目录中删除数十亿个文件,同时查看进度

从目录中删除数十亿个文件,同时查看进度

我有一个 30 TB 的目录,其中有数十亿个文件,形式上都是 JPEG 文件。我正在删除每个文件夹的文件,如下所示:

sudo rm -rf bolands-mills-mhcptz

该命令只是运行并且不显示任何内容无论它是否工作。

我想查看它正在删除文件或命令的当前状态是什么。

答案1

您可以使用每个删除的文件rm -v打印rm一行。这样你就可以看到rm删除文件确实起作用了。但如果您有数十亿个文件,那么您将看到的只是rm仍在工作。您将不知道有多少文件已被删除以及还剩下多少。

该工具pv可以帮助您估计进度。

http://www.ivarch.com/programs/pv.shtml

以下是使用示例输出调用rm的方法pv

$ rm -rv dirname | pv -l -s 1000 > logfile
562  0:00:07 [79,8 /s] [====================>                 ] 56% ETA 0:00:05

在这个人为的例子中,我告诉了pv1000文件。的输出pv显示 562 已被删除,经过的时间为 7 秒,预计完成时间为 5 秒。

一些解释:

  • pv -l使pv按换行符而不是字节进行计数
  • pv -s number告诉pv您总数是多少,以便它可以给您一个估计。
  • logfile最后的重定向是为了干净的输出。否则,状态行pv会与 的输出混淆rm -v。奖励:您将拥有删除内容的日志文件。但要注意文件会变得很大。/dev/null如果不需要日志,也可以重定向到。

要获取文件数量,可以使用以下命令:

$ find dirname | wc -l

如果有数十亿个文件,这也可能需要很长时间。您pv也可以在这里查看它已经计数了多少

$ find dirname | pv -l | wc -l
278k 0:00:04 [56,8k/s] [     <=>                                              ]
278044

这里说统计278k个文件用了4秒。 () 末尾的确切计数278044是 的输出wc -l

如果您不想等待计数,那么您可以猜测文件数量或pv直接使用:

$ rm -rv dirname | pv -l > logfile

这样您将无法估计要完成的任务,但至少您会看到有多少文件已被删除。/dev/null如果不需要日志文件,请重定向到。


吹毛求疵:

  • 你真的需要吗sudo
  • 通常rm -r足以递归删除。不需要rm -f

答案2

查看莱斯马纳的回答,它比我的好得多 - 尤其是最后一个例子,如果您指定而不是 ,pv它不会比原始静默花费更长的时间。rm/dev/nulllogfile

假设您rm支持该选项(因为您运行的是 Linux,所以可能会支持),您可以使用以下命令在详细模式下运行它-v

sudo rm -rfv bolands-mills-mhcptz

正如许多评论者所指出的,由于终端生成和显示的输出量很大,这可能会非常慢。您可以将输出重定向到文件:

sudo rm -rfv bolands-mills-mhcptz > rm-trace.txt

并观察 的大小rm-trace.txt

答案3

另一种选择是观察文件系统上的文件数量减少。在另一个终端中,运行:

watch  df -ih   pathname

rm随着进展,已使用的索引节点数量将会减少。 (除非文件大多具有多个链接,例如,如果树是使用创建的cp -al)。这会跟踪文件(和目录)数量的删除进度。 df没有-i将跟踪所使用的空间。

您还可以运行iostat -x 4查看每秒的 I/O 操作(以及 kiB/s,但这与纯元数据 I/O 不太相关)。


rm如果您对当前正在处理哪些文件感到好奇,您可以将 附加strace到它并观察unlink()(和 getdents)系统调用在您的终端上出现。例如sudo strace -p $(pidof rm)。您可以在不中断它的情况^c下分离该 strace 。rm

我忘记是否rm -r将目录更改为要删除的树;如果是这样你可以看看/proc/<PID>/cwd。它/proc/<PID>/fd可能经常打开一个目录 fd,因此您可以查看该目录以了解您的rm进程当前正在查看的内容。

答案4

您可以做的一件事是在后台启动该rm进程(没有输出,因此不会减慢速度),然后使用简单的(a)命令在前台监视它:

pax> ( D=/path/to/dir ; rm -rf $D & while true ; do
...>   if [[ -d $D ]] ; then
...>     echo "$(find $D | wc -l) items left"
...>   else
...>     echo "No items left"
...>     break
...>   fi
...>   sleep 5
...> done )

27912 items left
224 items left
No items left

pax> _

find/wc组合可以替换为任何能够为您提供所需单位的工具。


(一口井相对地简单,与核物理、黎曼假设或圣诞节给我妻子买什么相比:-)

相关内容