在tar存档中输出根目录

Min*_*int 10 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
Run Code Online (Sandbox Code Playgroud)

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

Rom*_*aka 12

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

tar tzf nginx-1.0.0.tar.gz | sed -e 's@/.*@@' | uniq
Run Code Online (Sandbox Code Playgroud)

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

path/to/file --> path
Run Code Online (Sandbox Code Playgroud)

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

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


Jus*_*owe 7

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

tar tzf nginx-1.0.0.tar.gz | head -1 | sed -e 's/\/.*//'
Run Code Online (Sandbox Code Playgroud)

我个人发现它更容易逃脱sed模式匹配中的内部/ \/而不是引入另一个分隔符,如@,但这只是一个偏好问题