我有一个目录,/Landsat_Data/
其中包含子目录(Landsat_Data/Site1
、Landsat_Data/Site2
等)。每个子目录都包含.tar.gz
文件(例如/Landsat_Data/Site2/LE70930862008092-SC20160107074735.tar.gz
等),每个.tar.gz
文件都包含像这样的 tif 或 xml 文件L
-rw-r--r-- espa/ie 29952 2016-01-07 14:57 LT50930861991021ASA00_sr_snow_qa.tif
我想要做的是将每个 tar 文件解压到它自己的子子目录中(例如Landsat_Data/Site2/LE70930862008092-SC20160107074735/
)。
到目前为止,我在 Landsat_Data 目录中使用此命令行:
find . -type f -name "*.tar.gz" -execdir tar -xvzf {} \;
但是,此命令将所有 tif 和 xml 文件提取到每个子目录(例如Landsat_Data/Site2
)中,而我只想解压LE70930862008092-SC20160107074735.tar.gz
以拥有一个名为的子子目录LE70930862008092-SC20160107074735
,其中包含所有 tif 和 xml 文件。知道我怎样才能实现我想要的吗?
答案1
尝试
find . -type f -name "*.tar.gz" -execdir tar -xvzf {} \;
根据man find
-execdir命令;
-execdir 命令 {} +
与 -exec 类似,但指定的命令是从包含匹配文件的子目录运行的,该子目录通常不是您开始查找的目录。
答案2
这里有一种方法(假设您使用 bash):
$ shopt -s globstar
$ for tar in /Landsat_Data/**/*.tar.gz; do
tar xvzf "$tar" --one-top-level="$(dirname "$tar")"/"$(basename "$tar" .tar.gz)"
done
该globstar
选项以递归方式**
匹配 0 个或多个文件和目录,因此/Landsat_Data/**/*.tar.gz
将匹配*tar.gz
./Landsat_Data/
该dirname
命令打印其输入的目录名称以及仅basename
带有您指定的扩展名的名称(此处tar.gz
已删除。因此,例如:
$ dirname /Landsat_Data/Site2/LE70930862008092-SC20160107074735.tar.gz
/Landsat_Data/Site2
$ basename /Landsat_Data/Site2/LE70930862008092-SC20160107074735.tar.gz .tar.gz
LE70930862008092-SC20160107074735
解释--one-top-level
如下man tar
:
--one-top-level[=DIR]
Extract all files into DIR, or, if used without argument, into a
subdirectory named by the base name of the archive (minus stan‐
dard compression suffixes recognizable by --auto-compress).
综合起来,这将满足您的要求。
如果您tar
没有该选项,您可以手动执行此操作:
$ shopt -s globstar
$ for tar in /Landsat_Data/**/*.tar.gz; do
newdir="$(dirname "$tar")"/"$(basename "$tar" .tar.gz)"
mkdir "$newdir"
tar xvzf "$tar" -C "$newdir"
done