我有一个大约13GB的tar.gz文件。它包含约120万个文件。当我解开所有这些文件时,所有这些文件都位于一个单一目录中,并且该目录中的任何读取都需要年龄。有什么办法可以将文件从焦油分为多个新文件夹?

例如:我想创建名为[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

根据您的外壳设置,用于检索TAR内容输出的最后一列(文件名)的“ cut -d''-f12”零件可能会导致问题,您必须对此进行修改。

它可以使用1000个文件,但是如果您的档案中有120万个文档,请考虑先用较小的内容进行测试。

其他提示

  • 获取带有列表的文件名列表
  • 制作包含GREP文件名的文件
  • 仅使用这些文件使用 - 文件

因此:

tar --list archive.tar > allfiles.txt
grep '^1' allfiles.txt > files1.txt
tar -xvf archive.tar --files-from=files1.txt

如果你有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 the树?如果没有,您可以按照文件中的文件来解开文件,然后使用脚本进行后处理,将文件移至所需的安排中。给定文件数,这将需要一些时间,但至少可以在后台完成。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top