我的流程Dockerfile如下:
以下代码一直有效,直到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)
我怎样才能做到这一点?
不。相反,使用 tar 将内容放入您选择的目录中。
tar可以删除每个文件路径的n个--strip-components组成部分 ( )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,您还可以使用通配符。
从文件中获取目录名的命令tar.xz是:
tar tJvf tar-file-name.tar.xz | head -1 | awk '{print $6}'
Run Code Online (Sandbox Code Playgroud)
您需要:
说明如何从tar文件中获取目录名:
焦油参数:
-f file
-J xz compression
-t list content
-v verbose
Run Code Online (Sandbox Code Playgroud)
head -1- 打印文件行
awk '{print $6}'- 打印第 6 个元素,即目录名称
例子:
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)
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压缩文件,我使用了tarj标志
像那样:
$ 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