UNIX将内容解压缩到多个文件夹中

时间:2010-08-29 13:32:36

标签: unix shell tar utilities

我有一个大小约为13GB的tar.gz文件。它包含大约120万份文件。当我解开这个时,所有这些文件都放在一个目录中。此目录中的任何读取都需要很长时间有什么办法可以将tar中的文件拆分成多个新文件夹吗?

例如:我想创建名为[1,2,...]的新文件夹,每个文件夹有1000个文件。

5 个答案:

答案 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)

  • 使用--list
  • 获取文件名列表
  • 使用grep
  • 制作包含文件名的文件
  • 使用--files-from
  • 仅解压缩这些文件

因此:

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吗?如果没有,您可以解压缩文件中的文件,然后使用脚本对文件进行后处理,以将文件移动到所需的排列。鉴于文件数量,这将花费一些时间,但至少可以在后台完成。