-2

我创建了一个脚本,它将提取所有*.tar.gz文件。这个文件被解压了五次.tar.gz文件,但问题是只有第一个 *.tar.gz 文件被解压。

for file in *.tar.gz; do
        gunzip -c "$file" | tar xf -
done
rm -vf "$file"

我该怎么做?非常感谢答案。

4

1 回答 1

4

如果您的问题是 tar.gz 文件包含另一个也应该被提取的 tar.gz 文件,那么您需要一种不同类型的循环。循环顶部的通配符for仅在循环开始时评估,因此它不包括从 tar.gz 中提取的任何内容

你可以尝试类似的东西

while true; do
    for f in *.tar.gz; do
        case $f in '*.tar.gz') exit 0;; esac
        tar zxf "$f"
        rm -v "$f"
    done
done

case取决于(默认情况下)当没有文件与通配符匹配时,它保持未扩展的事实。如果它们与默认值不同,您可能必须更改 shell 的通配选项。

如果您的意思是它被压缩(未解压缩)五次,尽管有单个 .gz 扩展名,也许您需要改为

for i in 1 2 3 4; do
    gunzip file.tar.gz
    mv file.tar file.tar.gz
done
tar zxf file.tar.gz
于 2014-05-07T04:49:13.467 回答