我有不同树种的物候数据,但是它们被较大的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年起)中,等效tar
于pax
程序,也没有gzip支持。据我所知gzip
,POSIX中没有(也不具有等效功能),因此不可能创建一个完全符合正式POSIX标准的解决方案。
幸运的gzip
是,这是事实上的标准。在最坏的情况下,以上代码应gzip
在tar
(或pax
)之前运行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句