单个目录中大约有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
测试它。当然,对于这个测试,将重复列出具有相同日期的文件,因为目录实际上并未创建。如果你使用或更多 重复,你应该知道每个目录中将有多少文件。mkdir
mv
mkdir
head -n 1000
如果文件太多或太少,您可以更改时间样式格式,使其成为每周或每小时的存档。每个目录中的文件数量应为 1000-10000 个左右,这样您就可以拥有 700-7000 个目录,这两个目录都易于管理。
一旦将它们移动到子目录中,您就可以压缩每个目录,这将为您提供大约 7000 个文件来移动,如果它们是文本文件,则只需复制 650GB 中的一小部分。