我正在尝试使用shell脚本编译nginx之类的东西时自动执行该过程。 (我不想使用apt-get
)
目前我有这个:
wget http://nginx.org/download/nginx-1.0.0.tar.gz
tar xf nginx-1.0.0.tar.gz
但是接下来我需要找出它所提取的目录名称,以便我可以启动配置脚本。
答案 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脚本时,我发现了这一点。希望这可以帮助别人。