【问题标题】:Output the root directory in a tar archive在 tar 存档中输出根目录
【发布时间】:2011-08-07 03:52:56
【问题描述】:

我正在尝试自动化您在使用 shell 脚本编译 nginx 之类的东西时所经历的过程。 (我不想用apt-get

目前我有这个:

wget http://nginx.org/download/nginx-1.0.0.tar.gz
tar xf nginx-1.0.0.tar.gz

但接下来我需要找出目录名称是从哪里提取的,以便我可以启动配置脚本。

【问题讨论】:

标签: shell debian tar


【解决方案1】:

使用它来找出档案的顶级目录(-ies)。

tar tzf nginx-1.0.0.tar.gz | sed -e 's@/.*@@' | uniq

sed 在这里被调用以获取由tar 打印的路径的第一个组件,因此它进行了转换

path/to/file --> path

它通过执行s command 来做到这一点。我使用@ 符号作为分隔符,而不是更常见的/ 符号,以避免在正则表达式中转义/。所以,这个命令的意思是:用空字符串替换匹配/.*模式的部分字符串(即斜线后跟任意数量的任意字符)。或者,换句话说,删除第一个斜杠之后(包括)的部分字符串。

(必须修改它以使用绝对文件名;但是,这些在 tar 文件中非常罕见。但请确保这种理论上的可能性不会在您的代码中造成漏洞!)

【讨论】:

  • 谢谢,这正是我所追求的。您不会有时间解释 sed 正则表达式的工作原理吗?
  • 与 tzf 出现错误不是 gzip 形式,用 tf 替换 tzf 工作
【解决方案2】:

按照另一个答案中的描述使用 sed 是一个好方法,但最好在 sed 之前使用 head -1 而不是在之后使用 uniq;这具有更好的性能-您仅通过 sed 抽取第一行,这也避免了 uniq 将 sed 的整个输出加载到内存中的要求。此外,如果 tar 包含多个顶级目录,这将返回第一个顶级目录,而 uniq 将为您提供所有顶级目录。

tar tzf nginx-1.0.0.tar.gz | head -1 | sed -e 's/\/.*//'

我个人认为将 sed 的模式匹配中的内部 / 转义为 \/ 比引入另一个分隔符(例如 @)更可读,但这只是一个偏好问题

【讨论】:

    【解决方案3】:

    上述许多答案都是正确的,但我遇到了实际 tar 停止由于管道到 head 的情况。

    Borne shell 中的以下命令:

    tar -v -zxf plotutils-3.1.tar.gz | head -1 | cut -d "/" -f 1
    

    会产生顶层目录名:plotutils-3.1 但是,生成的目录将是空的或包含一项。 我正在使用 ubuntu。要获得 tar 的实际结果,您必须执行另一个命令

    tar -zxf plotutils-3.1.tar.gz  
    

    再次。我不确定我在这里做错了什么;但这应该注意。我在尝试编写 shell 脚本以自动运行 autotool 的配置脚本时发现了这一点。希望这对其他人有帮助。

    【讨论】:

      【解决方案4】:

      目录名称应为nginx-1.0.0 或任何不带.tar.gz 的压缩包名称。在 wget 和 tar 之后试试这个:

      cd nginx*
      ./configure
      # etc
      

      如果你愿意,你也可以使用变量。

      name='nginx-1.0.0' # or $1, or whatever works for you
      wget "http://nginx.org/download/$name.tar.gz"
      tar -xf "$name.tar.gz"
      ./$name/configure
      

      不过,老实说,最好的解决方案是在解压后 cd 进入正确的目录,无论您使用 glob 还是变量作为目录名称。

      【讨论】:

      • 我真的不想把它当作即时脚本编写,而是坚持使用变量。我刚刚将我的 tarball 重命名为 nginx-1.0.2m.tar.gz,然后将其解压缩,我得到了 nginx-1.0.0
      • @Mint 之所以会这样是因为惯例(压缩包通常有一个与压缩包同名的顶级目录)。我将添加一个使用变量的解决方案,但它会很弱。真的没有理由不 cd。
      【解决方案5】:

      此处给出的答案不适用于绝对路径,因为它们会将它们修剪到路径的第一个目录。如果您创建了一个带有绝对路径的 tar 存档,则以下 sn-p 将返回其原始根目录:

      tar tf archive.tar | head -1
      

      对于压缩的 .tar.gz 档案添加选项 c。希望这对其他人有所帮助。

      【讨论】:

        【解决方案6】:

        如何获取所有顶级目录(包括 . ):

        tar tf nginx-1.0.0.tar.gz | xargs dirname | sort | uniq
        

        要获得第一个顶级目录,我将使用@thomas-steinbach 发布的解决方案:

        tar tf nginx-1.0.0.tar.gz | head -1
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-04-20
          • 1970-01-01
          • 2014-09-12
          • 1970-01-01
          • 2017-01-23
          • 2012-04-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多