我有一个大小约为13GB的tar.gz文件。它包含大约120万份文件。当我解开这个时,所有这些文件都放在一个目录中。此目录中的任何读取都需要很长时间有什么办法可以将tar中的文件拆分成多个新文件夹吗?
例如:我想创建名为[1,2,...]的新文件夹,每个文件夹有1000个文件。
答案 0 :(得分:4)
这是一个快速而肮脏的解决方案,但它可以在不使用任何临时文件的情况下完成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万个文档,请考虑使用较小的文件进行测试。
答案 1 :(得分:1)
因此:
tar --list archive.tar > allfiles.txt
grep '^1' allfiles.txt > files1.txt
tar -xvf archive.tar --files-from=files1.txt
答案 2 :(得分:1)
如果你有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 ...
答案 3 :(得分:0)
您可以查看手册页,看看是否有类似的选项。最糟糕的是,只需提取您需要的文件(可能使用--exclude)并将它们放入您的文件夹中。
答案 4 :(得分:0)
tar不直接提供该功能。它只将文件恢复到最初生成它的结构中。
您可以修改源目录以在那里创建所需的结构,然后对树进行tar吗?如果没有,您可以解压缩文件中的文件,然后使用脚本对文件进行后处理,以将文件移动到所需的排列。鉴于文件数量,这将花费一些时间,但至少可以在后台完成。