如何以编程方式获取 tar 存档解压后的文件或目录名称?

zwi*_*ion 5 command-line tar

我的流程Dockerfile如下:

  1. 使用 wget 下载 tar 文件。
  2. 解压该文件。
  3. 对文件执行一些操作。在这种情况下,请将内容移动到另一个位置。

以下代码一直有效,直到ffmpeg版本仍然是 3.4.1。因此,今天可用的版本ffmpeg是 3.4.2,并且代码无法正常工作。

我想找到一种方法在解压过程后获取文件名并将其传递给下一步

RUN wget http://johnvansickle.com/ffmpeg/releases/ffmpeg-release-64bit-static.tar.xz
RUN tar xf ffmpeg-release-64bit-static.tar.xz
RUN mv ffmpeg-3.4.1-64bit-static/ffmpeg /usr/local/bin/
RUN mv ffmpeg-3.4.1-64bit-static/ffprobe /usr/local/bin/  
Run Code Online (Sandbox Code Playgroud)

它可能是这样的:

RUN DIRNAME = tar xf ffmpeg-release-64bit-static.tar.xz
RUN mv $DIRNAME/ffmpeg /usr/local/bin/
RUN mv $DIRNAME/ffprobe /usr/local/bin/
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

mur*_*uru 6

不。相反,使用 tar 将内容放入您选择的目录中。

  1. tar可以删除每个文件路径的n个--strip-components组成部分 ( )
  2. tar可以应用任意 sed 表达式来更改每个文件的路径 ( --transform)

所以我会做类似的事情:

mkdir ffmpeg
wget -O - http://johnvansickle.com/ffmpeg/releases/ffmpeg-release-64bit-static.tar.xz |
  tar --xz -x -C ffmpeg --strip-components=1
Run Code Online (Sandbox Code Playgroud)

在这里,我自己创建了目录,并告诉 tar 在那里提取(选项-C),同时从提取的文件的路径中删除第一个组件。这样ffmpeg-3.4.1-64bit-static/ffprobe就变成了ffprobe 目录里面ffmpeg

或者:

wget -O - http://johnvansickle.com/ffmpeg/releases/ffmpeg-release-64bit-static.tar.xz |
  tar --xz -x --transform='s:[^/]*/:ffmpeg/'
Run Code Online (Sandbox Code Playgroud)

这里,我只是将路径的第一个组成部分更改为ffmpeg,因此不需要自己创建目录。所以,ffmpeg-3.4.1-64bit-static/ffmpeg变成ffmpeg/ffmpeg.

或者,知道您特别想要将这些特定文件转储到 中/usr/local/bin,请-C使用 直接将文件放置在那里,同时删除所有目录组件并准确选择要提取的文件:

wget -O - http://johnvansickle.com/ffmpeg/releases/ffmpeg-release-64bit-static.tar.xz |
  tar Jx -C /usr/local/bin --transform='s:.*/::' --wildcards '*/ffmpeg' '*/ffprobe'
Run Code Online (Sandbox Code Playgroud)

对于任何 tar,您都可以指定要提取的文件。使用 GNU tar,您还可以使用通配符。


Yar*_*ron 0

从文件中获取目录名的命令tar.xz是:

tar tJvf tar-file-name.tar.xz | head -1 | awk '{print $6}'
Run Code Online (Sandbox Code Playgroud)

您需要:

  1. 获取目录名称(例如使用上面的解决方案)并将其保存在变量中
  2. 解压缩tar.xz文件(例如使用tar xf命令)
  3. 使用目录变量移动文件

说明如何从tar文件中获取目录名:

焦油参数:

-f file
-J xz compression
-t list content
-v verbose
Run Code Online (Sandbox Code Playgroud)

head -1- 打印文件行

awk '{print $6}'- 打印第 6 个元素,即目录名称


例子:

  1. tar.xz例子:

    tar tJvf coreutils-8.22.tar.xz | tJvf coreutils-8.22.tar.xz | 头-1 | awk '{打印 $6}'

结果:

coreutils-8.22/
Run Code Online (Sandbox Code Playgroud)
  1. tar.bz2例如ffmpeg-3.4.2.tar.bz2

    tar tjvf ffmpeg-3.4.2.tar.bz2 | 头-1 | awk '{打印 $6}'

结果:

ffmpeg-3.4.2/
Run Code Online (Sandbox Code Playgroud)

请注意,对于bz2压缩文件,我使用了tar j标志


Ark*_*zyk 0

像那样:

$ tar tf ffmpeg-release-64bit-static.tar.xz | head -1 | cut -d '/' -f1
ffmpeg-3.4.2-64bit-static
Run Code Online (Sandbox Code Playgroud)

注意,GNU tar不需要等,它可以自动检测存档类型。-j-z