如何使用shell脚本解压所有的.tar.gz文件?

13

我尝试了这个:

DIR=/path/tar/*.gz

if [ "$(ls -A $DIR 2> /dev/null)" == "" ]; then
  echo "not gz"
else
  tar -zxvf /path/tar/*.gz -C /path/tar
fi

如果文件夹只有一个tar包,那么它可以正常工作。但是如果文件夹中有多个tar包,则会出现错误。

我该怎么做呢?

我想通过循环来解压缩,但是我不知道如何解决这个问题。

4个回答

27
for f in *.tar.gz
do
  tar zxvf "$f" -C /path/tar
done

如果您想跳过父目录,则使用 --strip-components=NUMBER 命令从文件名中删除 NUMBER 个前导组件。 - Pavan Kumar N

14

我发现find exec语法非常有用:

find . -name '*.tar.gz' -exec tar -xzvf {} \;

{}会被找到的每个文件替换,并执行该行。


3
for a in /path/tar/*.gz
do
    tar -xzvf "$a" -C /path/tar
done

注意事项

  • 这假定以.gz结尾的文件是gzip压缩的tar文件。通常使用.tgz.tar.gz表示,但是如果有问题,tar将失败。
  • 你可能会发现先cd /path/tar更容易,然后可以在解压命令中省略-C /path/tar和循环中的/path/tar/

0

接受的答案对我有用,稍作修改后就可以使用了

for f in *.tar.gz
do
  tar zxvf "$f" -C \name_of_destination_folder_inside_current_path
done

我不得不将正斜杠改为反斜杠,然后它就对我起作用了。


1
我只能假设这是一个特定于Windows的解决方法;它并没有提供与所要求的问题显著不同的解决方案。 - chepner
@chepner 没错,我是在 Windows 上工作的。 - Shamsa

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