【问题标题】:Extract file using bash script使用 bash 脚本提取文件
【发布时间】:2014-05-07 01:52:47
【问题描述】:

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

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

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

【问题讨论】:

  • 请改写你的问题,很难理解你在问什么。如果您的问题是解压后只有一个文件被删除,那是因为您的 rm -vf 语句不在您的 for 循环中。它需要在done 之前。
  • 我的问题是关于解压 tar.gz 文件,它被解压了 5 次,问题是我只解压了一次。循环必须提取所有 tar.gz 文件
  • 所以,你在启动时目录中有5个.tar.gz文件;您运行带有循环的脚本;它提取同一个文件 5 次而不是每次提取 5 个文件?当您使用bash -x yourscript.sh 运行时会发生什么?你能显示它的输出吗?你有没有想过使用tar -xvf -?您在哪个平台上需要手动执行 gunzip - 因为 GNU tar 会自动处理解压缩?

标签: bash loops tar gunzip


【解决方案1】:

如果您的问题是 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

【讨论】:

  • +1,从您的回答中,我开始理解OP的问题。也许你的猜测是对的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-19
  • 1970-01-01
相关资源
最近更新 更多