我有一个 tar 文件,其中包含大约 1900 万个文件(没有文件夹)
0000107b869682826003b04a40e6394.txt
00029237482s8923789423ud8923892.txt
2c002y8378723887292377a79237649.txt
f598238209237408238742308374038.txt
如何解压所有文件,使它们出现在以文件前四个字符命名的子目录中。因此,对于上述示例,它将创建0000
、2c02
和f599
目录,每个目录将包含以下文件。
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 的文件会花一些时间,而且我确信存在更优雅的解决方案...但似乎可以完成你所要求的工作 :-)