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

8
有没有一种方法可以在包含zip文件的文件夹中解压缩所有gz文件,即使zip文件在子目录中也可以。查询为:

find -type f -name "*.gz"

给出类似以下的结果:
./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
2个回答

8
如果你想对它们中的每一个启动"gzip -d":
cd theparentdir && gzip -d $(find ./ -type f -name '*.gz')

然后,将它们压缩回去:

cd theparentdir && gzip $(find ./ -type f -name '*.csv')

然而,在许多情况下,这样做可能会出现问题:

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

解决方案是,如果您拥有GNU find,则执行以下操作:

find ... -print0 | xargs -0 gzip -d # 对于gunzip,但仍会对带有“换行符”的文件产生问题

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

cd theparentdir && find ./ -type f -name '*.gz' -exec gzip -d '{}' '+'

并重新压缩该父目录及其所有子目录中的所有csv文件:

cd theparentdir && find ./ -type f -name '*.csv' -exec gzip '{}' '+'

"+" 告诉 GNU find 尽可能多地将找到的文件放在每个 gzip 调用中(而不是对每个文件进行 1 次 gzip 调用,这非常消耗资源且效率低下和缓慢),类似于 xargs,但具有一些好处(仅需 1 个命令,无需使用管道)。

谢谢,@BachtiarPanjaitan;我还会添加一个更新,因为我展示的方法不安全(例如,对于带有空格的文件无法工作) - Olivier Dulac
@BachtiarPanjaitan:已更新答案。请使用后者的变体,更灵活、更高效、更安全(可在更多情况下工作)。 - Olivier Dulac

7

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

gzip -dr ./datasets

所有的归档文件将会解压缩到它们自己的目录中。

例如:gzip -dr ./a

a/b/c/test1.gz
a/b/d/test2.gz
a/e/test3.gz

执行完后:

a/b/c/test1
a/b/d/test2
a/e/test3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接