代码之家  ›  专栏  ›  技术社区  ›  Srikar Appalaraju Tonetel

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

  •  3
  • Srikar Appalaraju Tonetel  · 技术社区  · 14 年前

    e、 g:我想创建名为[1,2,…]的新文件夹,每个文件夹有1000个文件。

    5 回复  |  直到 14 年前
        1
  •  4
  •   lecodesportif    14 年前

    这是一个快速而肮脏的解决方案,但它在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万个文件,请考虑首先使用较小的文件进行测试。

        2
  •  1
  •   Sjoerd    14 年前
    • 使用--list获取文件名列表
    • 使用grep生成包含文件名的文件

    因此:

    tar --list archive.tar > allfiles.txt
    grep '^1' allfiles.txt > files1.txt
    tar -xvf archive.tar --files-from=files1.txt
    
        3
  •  1
  •   Dennis Williamson    14 年前

    如果你有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 ...
    
        4
  •  0
  •   ghostdog74    14 年前

        5
  •  0
  •   sizzzzlerz    14 年前

    您能修改源目录以在那里创建所需的结构,然后对树进行tar吗?如果没有,您可以按文件中的原样解压文件,然后使用脚本对该目录进行后期处理,以将文件移动到所需的排列中。考虑到文件的数量,这将需要一些时间,但至少可以在后台完成。