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

发布于 2024-09-16 03:32:11 字数 171 浏览 28 评论 0原文

我有一个大约 13GB 大小的 tar.gz 文件。它包含大约 120 万份文档。当我解压这些文件时,所有这些文件都位于一个目录中从此目录进行任何读取都需要很长时间。有什么方法可以将 tar 中的文件拆分到多个新文件夹中吗?

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

I have a tar.gz file about 13GB in size. It contains about 1.2 million documents. When I untar this all these files sit in one single directory & any reads from this directory takes ages. Is there any way I can split the files from the tar into multiple new folders?

e.g.: I would like to create new folders named [1,2,...] each having 1000 files.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

享受孤独 2024-09-23 03:32:11

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

This is a quick and dirty solution but it does the job in Bash without using any temporary files.

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

Same as a one liner:

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

Depending on your shell settings the "cut -d ' ' -f12" part for retrieving the last column (filename) of tar's content output could cause a problem and you would have to modify that.

It worked with 1000 files but if you have 1.2 million documents in the archive, consider testing this with something smaller first.

浅唱々樱花落 2024-09-23 03:32:11
  • 使用 --list 获取文件名列表
  • 使用 grep 生成包含文件名的文件
  • 使用 --files-from 仅解压这些文件

因此:

tar --list archive.tar > allfiles.txt
grep '^1' allfiles.txt > files1.txt
tar -xvf archive.tar --files-from=files1.txt
  • Obtain filename list with --list
  • Make files containing filenames with grep
  • untar only these files using --files-from

Thus:

tar --list archive.tar > allfiles.txt
grep '^1' allfiles.txt > files1.txt
tar -xvf archive.tar --files-from=files1.txt
别靠近我心 2024-09-23 03:32:11

如果您有 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 ...

If you have GNU tar you might be able to make use of the --checkpoint and --checkpoint-action options. I have not tested this, but I'm thinking something like:

# 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 ...
瑕疵 2024-09-23 03:32:11

你可以查看手册页,看看是否有类似的选项。最糟糕的是,只需提取您需要的文件(也许使用 --exclude )并将它们放入您的文件夹中。

you can look at the man page and see if there are options like that. worst comes to worst, just extract the files you need (maybe using --exclude ) and put them into your folders.

情定在深秋 2024-09-23 03:32:11

tar 不直接提供该功能。它仅将其文件恢复到最初生成时的相同结构。

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

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文