解压目录和子目录中的所有 .gz

use*_*515 3 linux terminal tar

首先,我检查了大多数可用的解决方案,没有

如何使用 shell-script 解压所有 .tar.gz?

解压缩一个目录中的多个 zip 文件?

我有一个目录,其中包含包含 .gz 文件的子目录,我想将所有文件提取到一个文件夹中,或者只是将它们保存在各自的文件夹中。先感谢您

Sch*_*uer 6

问题

您想解压缩目录及其所有子目录中的所有压缩文件。

解决方案

使用 bash 和实用程序find将当前目录中所有内容的列表输出到控制台。使用循环结构解压缩每个文件。

解压当前目录下的所有文件:

$ for file in `ls -1`; do
       sudo tar -xvf "${file}" ; done
Run Code Online (Sandbox Code Playgroud)

解压缩当前目录和任何子目录中的所有档案(我个人最喜欢的):

$ for file in `find *`; do
       sudo tar -xvf "${file}" ; done
Run Code Online (Sandbox Code Playgroud)

递归地解压缩所有档案并对剩余的任何档案再次执行相同的操作:

# Make the above loop a function to be called more than once 
# In case of compressed files inside compressed files this will 
# run twice the previous snippet.

$ function decompress_all_complete () {
     function decompress_all () {
          for file in `find *`; do
                sudo tar -xvf "${file}" ; done
     } ;
    for i in `echo {1..2}`; do
         decompress_all_complete; done
}
Run Code Online (Sandbox Code Playgroud)

如果你喜欢冒险,你可以使用这个 for 循环的变体:-)



    $ for program in tar unzip untar ; do      # You could simply add to this list...
         for file in `find *`; do
               sudo `which "${program}"` -xvf "${file}" ; 
         done ;
    done

讨论

该实用程序find列出了您当前目录中的所有内容,并且速度很快。下面的代码段每次将文件解压缩一个目录,但说明了以下所有代码的简单逻辑。以上是解决此问题的选项和变体;起初我假设您当前的工作目录包含您想要解压缩以使用最简单版本的代码段的所有文件。

这个伪代码试图简要地传达我的解决方案背后的逻辑:

#Use all decompressing programs locally installed :: apropos compress
for --temp_container_1-- in --list_of_programs_to_decompress_files-- ; do

# run each program through every file in the current directory
for --temp_container_2-- in --list_of_files-- ; do

    # use program with x options on y file
    sudo "${temp_container_1}" [TYPE COMMON OPTIONS] "${temp_container_2} ;

# Successfully decompressed some files. Try another program.
done ;

# There is nothing else to do.
done
Run Code Online (Sandbox Code Playgroud)

语境

我使用 或 测试了这些片段:

* Linux debian 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt9-3 (2015-04-23) x86_64 GNU/Linux
* find (GNU findutils) 4.4.2
* GNU bash, version 4.3.33(1)-release (x86_64-pc-linux-gnu)
* tar (GNU tar) 1.27.1
Run Code Online (Sandbox Code Playgroud)



Ell*_*sch 4

如果我理解你的问题,你可以使用类似的东西

DEST=<Destination Folder>
SRC=<Src Folder>
find $SRC -name "*.tar.gz" -or -name "*.tgz" -exec tar xzvvf -C $DEST {} \;
Run Code Online (Sandbox Code Playgroud)