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

如何以编程方式获取 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 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 将内容放在您选择的目录中。

  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

这里,我自己创建了目录,并告诉 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}'

您需要:

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

解释如何从tar文件获取目录名称:

Tar参数:

-f file
-J xz compression
-t list content
-v verbose

head -1- 打印文件行

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


例子:

  1. tar.xz例子:

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

结果:

coreutils-8.22/
  1. 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

相关内容