添加到 TAR 并拆分目录中的 147k 个文件的存档

添加到 TAR 并拆分目录中的 147k 个文件的存档

我必须迁移一个网站,该网站的一个文件夹中包含 147,000 个图像文件。我尝试使用 gzip / tar 进行压缩,但退出时没有任何错误消息,并且存档文件长度为 0 字节。

$ tar cvf - web/uploads/documents/*.* | split -b 1024m - documents.tgz.

bash:/usr/bin/tar:参数列表太长

我认为这是因为我尝试一次添加的文件太多了。现在我正在寻找一种解决方案,将文件放入单独的存档中,每个存档都带有文件的首字母(a.tar < abacus.jpeg、admirate.png、amateur.gif 等)

我必须使用什么命令才能做到这一点?

先感谢您

答案1

下面我回答原始问题的 147k 部分。

我假设如果web/uploads/documents/*.*你的列表有 147k 个文件,那么 tar 选项-T就是你所需要的。下面来自 tar 手册页

   -T, --files-from=FILE
          get names to extract or create from FILE 

与 tar 中的其他选项一样,您可以-根据需要使用 inplace stdin/out。因此,在这种情况下,使用-T -将使 tar 从 stdin 读取文件列表。

如果你不提供ls任何通配符,你可以直接将输出导入到管道中,tar如下所示

ls web/uploads/documents | tar cvf - -T - | split -b 1024m - documents.tgz.

答案2

第一个问题:如果您想将目录中的所有文件都包含到 .tgz 存档中,则指定目录而不是文件应该可以工作(除非有任何文件/目录与 blob 不匹配*.*并且您试图将其排除在存档之外)。

你尝试过这个吗?:

tar cvf - web/uploads/documents | split -b 1024m - documents.tgz

第二个问题:从@pmqs 的回答中,您可以通过执行以下操作获取以字母开头的文件的 *.tgz 存档:

for letter in {a..z}; do
  find web/uploads/documents -iname ${letter}\* | tar -T - -czf ${letter}-documents.tgz
done

这假设您的文件名全部以从 a 到 z 的小写字母开头,并将生成名为 a-documents.tgz、b-documents.tgz 等的档案。

相关内容