【问题标题】:untar filename.tr.gz to directory "filename"将 filename.tr.gz 解压到目录“filename”
【发布时间】:2011-02-26 09:19:43
【问题描述】:

我想解压缩一个存档,例如使用 shell 命令将“tar123.tar.gz”复制到目录 /myunzip/tar123/”。

tar -xf tar123.tar.gz 将解压缩文件,但在与我工作的目录相同的目录中。

如果文件名是“tar233.tar.gz”,我希望将其解压缩到 /myunzip/tar233.tar.gz”,因此目标目录将基于文件名。

有谁知道 tar 命令是否可以做到这一点?

【问题讨论】:

    标签: shell tar


    【解决方案1】:

    使用 Bash 和 GNU tar:

    file=tar123.tar.gz
    dir=/myunzip/${file%.tar.gz}
    mkdir -p $dir
    tar -C $dir -xzf $file
    

    【讨论】:

    • 这里的问题是我不知道文件名是什么。这将是一个版本化文件,所以今天可能是 1.tar.gz,但明天可能是 2.tar.gz。有没有办法只说“file=what-ever-in-/home/user”?
    • 你必须以某种方式知道它。如果他们排序,你可以使用类似file=$(ls -1 $pattern | tail -1)
    【解决方案2】:
    tar -xzvf filename.tar.gz -C destination_directory
    

    【讨论】:

      【解决方案3】:

      您可以在解压前使用-C 标志更改目录,但该目录必须已经存在。 (如果您创建特定于文件的目录,我强烈建议不要称它们为 foo.tar.gz - 扩展名意味着它是一个存档文件,但它实际上是一个目录。这导致混淆。)

      【讨论】:

        【解决方案4】:

        试试

        file=tar123.tar.gz
        dir=/myunzip/$(basename $file .tar.gz)   # matter of taste and custom here
        [ -d "$dir" ] && { echo "$dir already exists" >&2; exit 1; }
        mkdir "$dir" && ( gzip -d "$file | ( cd "$dir" && tar xf - ) )
        

        如果您使用的是 GNU tar,您还可以给它一个选项 -C "$dir",这将导致它在解压缩之前更改为目录。但是上面的代码即使使用青铜时代的 tar 也应该可以工作。

        免责声明:以上代码均未经过测试。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-11-13
          • 1970-01-01
          • 1970-01-01
          • 2017-05-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多