从 unix 服务器下载大量文件

从 unix 服务器下载大量文件

单个目录中大约有7000000个文件,总计650 GB。

(单独列出它们甚至是不可能的)

我有什么选项可以下载这些?

我正在考虑使用 tar 制作 1 GB 的包,然后下载这些包。

或者也许将它们分部分移动到不同的目录,以便更容易列出它们。

操作系统是 ubuntu 服务器。

每次添加文件时,都会在数据库中记录一个条目,现在数据库中的计数已超过 7000000。这也意味着,我知道它们的文件名。

答案1

这是一个主要的PITA:

  • 所有提到的程序,使用任何变体的程序ls都会崩溃或超时
  • 你必须通过其他方式跟踪进度
  • 你必须消除文件系统的压力
  • 您必须避免重复您所处的情况。rsync将重复这种情况。rawtar将重复这种情况。您不希望在其他文件夹中有 7000000 份副本。

好的,考虑到在这种情况下可能有效的方法:

  • 选择 python 或者任何你最了解的。
  • 与数据库对话并获取 1000 个块的文件名。
  • 将这 1000 个文件复制到另一个目录,然后对该目录进行 zip/tar 压缩,以将其发送到其他地方。如何以及是否移动这些捆绑的文件取决于该磁盘上的存储量。在同一个文件系统上保留另外 7000000 个文件(无论如何组织)会很有压力。
  • 如果这 1000 个块工作正常并且一切正常,则将该块的最高 ID 写入不同的数据库表(您不想对那个 7000000 的东西进行 ALTER TABLE 只是为了添加一个新的列“移动”,它可能会花费太长时间并且您会改变“真相”;创建第二个表并跟踪进度)
  • 重复。

最重要的事情:复制、验证,然后删除那个巨大文件夹中的原始文件。

将文件 1:1 复制到其他地方也是不明智的,因为您可能会重复现在所处的糟糕境地。

祝你好运。

答案2

如果您在名为的文件中列出文件名~/filelist.txt,然后转到所有文件所在的目录,则以下脚本应将它们移动到可管理大小的子目录中,每个子目录代表文件创建的每一天:-

cat ~/filelist.txt |                                           \
while f=`line`;                                                \
do ( d="`ls -l --time-style=+%y-%m-%d "$f"|awk '{print $6}'`"; \
     [ -d "$d" ] || mkdir "$d";                                \
     mv "$f" "$d"/                                             \
   )                                                           \
done

这将需要很长时间才能运行,因为您将为每个文件运行两个或三个程序以及一个bash子 shell。

我建议你在开始之前先使用head而不是cat和 前缀来echo测试它。当然,对于这个测试,将重复列出具有相同日期的文件,因为目录实际上并未创建。如果你使用或更多 重复,你应该知道每个目录中将有多少文件。mkdirmvmkdirhead -n 1000

如果文件太多或太少,您可以更改时间样式格式,使其成为每周或每小时的存档。每个目录中的文件数量应为 1000-10000 个左右,这样您就可以拥有 700-7000 个目录,这两个目录都易于管理。

一旦将它们移动到子目录中,您就可以压缩每个目录,这将为您提供大约 7000 个文件来移动,如果它们是文本文件,则只需复制 650GB 中的一小部分。

相关内容