我有一个大小约为 13GB 的 tar.gz 文件。它包含大约 120 万份文档。当我解压所有这些文件时,所有这些文件都位于一个目录中,并且从该目录中读取任何内容都需要很长时间。有什么方法可以将文件从 tar 拆分到多个新文件夹中?
例如:我想创建名为 [1,2,...] 的新文件夹,每个文件夹有 1000 个文件。
这是一个快速而肮脏的解决方案,但它在 Bash 中完成了这项工作,而不使用任何临时文件。
i=0 # file counter
dir=0 # folder name counter
mkdir $dir
tar -tzvf YOURFILE.tar.gz |
cut -d ' ' -f12 | # get the filenames contained in the archive
while read filename
do
i=$((i+1))
if [ $i == 1000 ] # new folder for every 1000 files
then
i=0 # reset the file counter
dir=$((dir+1))
mkdir $dir
fi
tar -C $dir -xvzf YOURFILE.tar.gz $filename
done
与单班轮相同:
i=0; dir=0; mkdir $dir; tar -tzvf YOURFILE.tar.gz | cut -d ' ' -f12 | while read filename; do i=$((i+1)); if [ $i == 1000 ]; then i=0; dir=$((dir+1)); mkdir $dir; fi; tar -C $dir -xvzf YOURFILE.tar.gz $filename; done
根据您的 shell 设置,用于检索 tar 内容输出的最后一列(文件名)的“cut -d ' -f12”部分可能会导致问题,您必须对其进行修改。
它适用于 1000 个文件,但如果存档中有 120 万个文档,请考虑先用较小的文件进行测试。
如果你有 GNU tar
,你也许可以使用--checkpoint
和--checkpoint-action
选项。我没有测试过这个,但我在想类似的东西:
# UNTESTED
cd /base/dir
mkdir $(printf "dir%04d\n" {1..1500}) # probably more than you need
ln -s dest0 linkname
tar -C linkname ... --checkpoint=1000 \
--checkpoint-action='sleep=1' \
--checkpoint-action='exec=ln -snf dest%u linkname ...
因此:
tar --list archive.tar > allfiles.txt
grep '^1' allfiles.txt > files1.txt
tar -xvf archive.tar --files-from=files1.txt
tar doesn't provide that capability directly. It only restores its files into the same structure from which it was originally generated.
Can you modify the source directory to create the desired structure there and then tar the tree? If not, you could untar the files as they are in the file and then post-process that directory using a script to move the files into the desired arrangement. Given the number of files, this will take some time but at least it can be done in the background.
您可以查看手册页,看看是否有类似的选项。最糟糕的是,只需提取您需要的文件(可能使用 --exclude )并将它们放入您的文件夹中。