命令获取压缩文件中最顶层的目录名称

命令获取压缩文件中最顶层的目录名称

文件名如下所示,但目录为libgit2-0.21-1 tar xvf v0.21.1.tar.gz,那么如何使用one-liner获取目录名(如果存在两个以上目录则报错):

tar tvf v0.21.1.tar.gz | head
drwxrwxr-x root/root         0 2014-08-05 08:09 libgit2-0.21.1/
-rw-rw-r-- root/root      1169 2014-08-05 08:09 libgit2-0.21.1/.HEADER
-rw-rw-r-- root/root        22 2014-08-05 08:09 libgit2-0.21.1/.gitattributes
-rw-rw-r-- root/root       321 2014-08-05 08:09 libgit2-0.21.1/.gitignore
-rw-rw-r-- root/root      1246 2014-08-05 08:09 libgit2-0.21.1/.mailmap

我对此有一种解决方案,但显然这不是最好的解决方案(我还必须检查顶部是否有多个目录):

mkdir libgit2 && tar xvf v0.21.1.tar.gz -C libgit2 --strip-components 1

答案1

使用 tarball 作为命令行参数执行以下脚本

#!/bin/bash

DIR=$(tar tvf ${1} | egrep -o "[^ ]+/$")

if [ $(echo ${DIR} | egrep -o " " | wc -l) -eq 0 ]; then
    echo ${DIR};
else
    echo "ERROR: multiple directories in tarball base"
    exit 1
fi

答案2

更新抱歉忘记您还想要最顶层目录的名称。我更新了命令以包含“else”。如果只找到一个目录,它将回显其名称。如果抛出“ERROR”,您可以查看“test.file”的内容来查看 tar 中的目录。

尝试这个:

$ zcat test.tar.gz | tar xvf - | \
    awk -F/ '{print $1}' | \
    uniq > test.file && \
    if (($(wc -l 'test.file' | \
    awk '{print $1}')>1));then echo "ERROR";else cat test.file;fi

男人zcat

zcat 与gunzip -c 相同。 (在某些系统上,zcat 可能安装为 gzcat 以保留要压缩的原始链接。)zcat 解压缩命令行或其标准输入上的文件列表,并将未压缩的数据写入标准输出。 zcat 将解压缩具有正确幻数的文件,无论它们是否具有 .gz 后缀。

awk -F/ '{打印 $1} |独特的

打印第一个由“/”标记的唯一单词。

> 测试文件

将输出写入文件

(($(wc -l 'test.file' | awk '{print $1}')>1))

双精度 ((..)) 结构允许算术扩展和求值。wc -l获取文件中的行数。awk '{print $1}')>1仅获取第一列,即行计数,并查看该数字是否大于 1。then echo "ERROR"如果在 tar 文件中找到多个目录,则打印“错误”。

希望有帮助。

相关内容