解压终端所有子目录下的所有gz文件

Pet*_*sen 4 linux terminal zip

有没有办法解压缩包含 zipfiles 的文件夹中的所有 gz 文件。当 zip 文件位于子目录中时。查询

find -type f -name "*.gz"
Run Code Online (Sandbox Code Playgroud)

给出如下结果:

./datasets/auto/auto.csv.gz
./datasets/prnn_synth/prnn_synth.csv.gz
./datasets/sleep/sleep.csv.gz
./datasets/mfeat-zernike/mfeat-zernike.csv.gz
./datasets/sonar/sonar.csv.gz
./datasets/wine-quality-white/wine-quality-white.csv.gz
./datasets/ring/ring.csv.gz
./datasets/diabetes/diabetes.csv.g
Run Code Online (Sandbox Code Playgroud)

Ben*_* Zu 7

有一个递归选项(-r)。

gzip -dr ./datasets
Run Code Online (Sandbox Code Playgroud)

所有存档都将解压到各自的目录中。

示例:gzip -dr ./a

a/b/c/test1.gz
a/b/d/test2.gz
a/e/test3.gz
Run Code Online (Sandbox Code Playgroud)

执行后:

a/b/c/test1
a/b/d/test2
a/e/test3
Run Code Online (Sandbox Code Playgroud)


Oli*_*lac 6

如果您想对其中的每一个都启动“gzip -d”:

cd theparentdir && gzip -d $(find ./ -type f -name '*.gz')
Run Code Online (Sandbox Code Playgroud)

然后,将它们压缩回来:

cd theparentdir && gzip $(find ./ -type f -name '*.csv')
Run Code Online (Sandbox Code Playgroud)

然而,这在许多情况下会窒息

  • 如果文件名中有一些特殊字符(空格、制表符、换行符等)
  • 其他类似案例
  • 或者如果在 gzip 命令之后放置太多文件!

一个解决方案是,如果你有 GNU 找到,做:

找到... -print0 | xarsg -0 gzip -d # for the gunzip one,但仍然被包含“换行符”的文件阻塞

另一个(可以说更好?)解决方案,如果您有 GNU 可供您使用:

cd theparentdir && find ./ -type f -name '*.gz' -exec gzip -d '{}' '+'
Run Code Online (Sandbox Code Playgroud)

并重新压缩该父目录和所有子目录中的所有 csv:

cd theparentdir && find ./ -type f -name '*.csv' -exec gzip '{}' '+'
Run Code Online (Sandbox Code Playgroud)

"+" 告诉 GNU find 尝试在每次 gzip 调用中放置尽可能多的找到的文件(而不是每个文件执行 1 个 gzip incocation,非常非常资源密集且非常低效和缓慢),类似于 xargs,但有一些好处(仅 1 个命令,无需管道)