如何根据文件名将多个文件解压到多个子目录中

如何根据文件名将多个文件解压到多个子目录中

我有一个 tar 文件,其中包含大约 1900 万个文件(没有文件夹)

0000107b869682826003b04a40e6394.txt
00029237482s8923789423ud8923892.txt
2c002y8378723887292377a79237649.txt
f598238209237408238742308374038.txt

如何解压所有文件,使它们出现在以文件前四个字符命名的子目录中。因此,对于上述示例,它将创建00002c02f599目录,每个目录将包含以下文件。

0000\0000107b869682826003b04a40e6394.txt
0002\00029237482s8923789423ud8923892.txt
2c02\2c002y8378723887292377a79237649.txt
f598\f598238209237408238742308374038.txt

我已经尝试创建一个脚本,该脚本遍历 tar 文件中的文件,创建一个目录并从 tar 中提取该文件并将其放入目录中。这适用于少量文件,但当 tar 中有数百万个文件时,提取将花费很长时间。

答案1

使用 GNUtar及其s语法的命令sed。我从 切换s///s|||

tar -xvf file.tar --transform 's|\(....\).*|\1/&|' --show-transformed-names

答案2

我创建了一个测试 tarball,没有目录:

pg@TREX:~/test$ tar -tvf test.tar | rev | cut -c -8 | rev
0001.txt
0002.txt
0003.txt
0004.txt
0005.txt
0011.txt
0012.txt
0013.txt
0014.txt
0015.txt
0021.txt
0022.txt
0023.txt
0024.txt
0025.txt

我运行这个脚本(tartest.sh):

#!/bin/bash

tar -xf tarfile.tar
i=$(ls *.txt | cut -c -3 | sort | uniq) 
echo "$i" >> directory_list 
mkdir $i 
while read line; do mv $line*.txt $line/; done < directory_list

结果:

pg@TREX:~/test$ tree
.
├── 000
│   ├── 0001.txt
│   ├── 0002.txt
│   ├── 0003.txt
│   ├── 0004.txt
│   └── 0005.txt
├── 001
│   ├── 0011.txt
│   ├── 0012.txt
│   ├── 0013.txt
│   ├── 0014.txt
│   └── 0015.txt
├── 002
│   ├── 0021.txt
│   ├── 0022.txt
│   ├── 0023.txt
│   ├── 0024.txt
│   └── 0025.txt
├── directory_list
├── tartest.sh
└── test.tar

我确信处理 19mil 的文件会花一些时间,而且我确信存在更优雅的解决方案...但似乎可以完成你所要求的工作 :-)

相关内容