在 Linux 中解压包含初始文件夹内容的子文件夹

在 Linux 中解压包含初始文件夹内容的子文件夹

我有一个目录,/Landsat_Data/其中包含子目录(Landsat_Data/Site1Landsat_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 

相关内容