在tar存档中输出根目录

时间:2011-04-17 02:56:59

标签: shell debian tar

我正在尝试使用shell脚本编译nginx之类的东西时自动执行该过程。 (我不想使用apt-get

目前我有这个:

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

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

6 个答案:

答案 0 :(得分:12)

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

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

sed来获取tar打印的路径的第一个组件,因此它会转换

path/to/file --> path

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

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

答案 1 :(得分:7)

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

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

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

答案 2 :(得分:0)

目录名称应该是nginx-1.0.0或者没有.tar.gz的tarball名称。在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

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

答案 3 :(得分:0)

这里给出的答案对绝对路径不起作用,因为它们将它们剪切到路径的第一个目录。如果您已创建具有绝对路径的tar存档,则以下代码段将返回其原始根目录:

tar tf archive.tar | head -1

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

答案 4 :(得分:0)

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

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

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

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

答案 5 :(得分:0)

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

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的configure脚本时,我发现了这一点。希望这可以帮助别人。