我有一个流程,Dockerfile
其步骤如下:
- 使用 wget 下载 tar 文件。
- 解压文件。
- 对文件执行某些操作。在本例中,将内容移动到另一个位置。
以下代码在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 DIRNAME = tar xf ffmpeg-release-64bit-static.tar.xz
RUN mv $DIRNAME/ffmpeg /usr/local/bin/
RUN mv $DIRNAME/ffprobe /usr/local/bin/
我怎样才能实现这个目标?
答案1
不要。相反,使用 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
这里,我自己创建了目录,并告诉 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/'
这里,我只是将路径的第一个部分改为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'
使用任何 tar,您都可以指定要提取的文件。使用 GNU tar,您还可以使用通配符。
答案2
从文件中获取目录名的命令tar.xz
是:
tar tJvf tar-file-name.tar.xz | head -1 | awk '{print $6}'
您需要:
- 获取目录名称(例如使用上述解决方案)并将其保存在变量中
- 解压缩 tar.xz 文件(例如使用 tar xf 命令)
- 使用目录变量移动文件
解释如何从tar
文件获取目录名称:
Tar参数:
-f file
-J xz compression
-t list content
-v verbose
head -1
- 打印文件行
awk '{print $6}'
- 打印第 6 个元素,即目录名称
例子:
tar.xz
例子:tar tJvf coreutils-8.22.tar.xz | head -1 | awk'{打印$6}'
结果:
coreutils-8.22/
tar.bz2
例如ffmpeg-3.4.2.tar.bz2
tar tjvf ffmpeg-3.4.2.tar.bz2 | head -1 | awk'{打印$6}'
结果:
ffmpeg-3.4.2/
请注意,对于
bz2
压缩文件,我使用了tar
j
标志
答案3
像那样:
$ tar tf ffmpeg-release-64bit-static.tar.xz | head -1 | cut -d '/' -f1
ffmpeg-3.4.2-64bit-static
请注意,不需要GNU tar
等,它可以自动检测档案类型。-j
-z