提取不同子目录中的.tar.gz文件

m4D_guY

我有不同树种的物候数据,但是它们被较大的Treegroup保存。

输出find . -name *.tar.gz为:

./Tilia/PEP725_DE_129_070.tar.gz
./Tilia/PEP725_DE_129_071.tar.gz
./Fagus/PEP725_DE_108_010.tar.gz
./Acer/PEP725_DE_115_000.tar.gz
./Acer/PEP725_DE_115_030.tar.gz
./Betula/PEP725_DE_106_020.tar.gz

我要提取其子目录中的每个文件,并且输出目录的名称应与tar文件相同。

我设法用提取所有内容,find . -name *.tar.gz -execdir tar -xvzf "{}" \;但这不会在压缩文件后创建目录名称。

我该怎么做呢?-C需要目录已经存在结束...

所以最后我想

Tilia/EP725_DE_129_070/content_of_PEP725_DE_129_070.tar.gz

等等...

卡米尔·马乔洛夫斯基

如果您的tar支持--one-top-level选项:

find . -name "*.tar.gz" -execdir tar --one-top-level -xvzf {} \;

来自man 1 tar

--one-top-level[=DIR]

将所有文件提取到DIR,或者(如果不带参数使用的话)提取到以归档文件的基本名称命名的子目录(减去可以识别的标准压缩后缀--auto-compress)。

注意:{}可能会或可能不会被引用,但是*.tar.gz 应该被引用以避免类似的麻烦:find使用通配符时,实用程序不会输出所有文件


如果您tar不支持该--one-top-level选项,则-C是个不错的主意,您只需要首先创建一个相应的目录即可。但是,此命令更进一步,甚至没有使用-C

find . -type f -name "*.tar.gz" -execdir sh -c '
   dirn="${1%.tar.gz}"         # desired directory name
   mkdir -- "$dirn"            # creating a directory
   cd -- "$dirn" &&
   tar -xvzf ../"$1"           # extracting to it
' find-sh {} \;

这里唯一的非POSIX组件是……tar本身。tar唯一公认的传统工具无gzip的支持。在POSIX(自2001年起)中,等效tarpax程序,也没有gzip支持。据我所知gzip,POSIX中没有(也不具有等效功能),因此不可能创建一个完全符合正式POSIX标准的解决方案。

幸运的gzip是,这是事实上的标准。在最坏的情况下,以上代码应gziptar(或pax之前运行

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章