Как я программно получаю имя файла или каталога после извлечения после архива tar?

У меня есть процесс в моем Dockerfile с выполнять шагами:

  1. Загрузите файл tar с помощью wget.
  2. untar файл.
  3. Выполните некоторую операцию с файлом. В этом случае переместите содержание в другое место.

Следовать работы кода до ffmpeg версия все еще 3.4.1. Так, сегодня доступная версия для ffmpeg 3.4.2, и код не работает.

Я хочу найти способ захватить назад имя файла после процесса untar и передать его следующим шагам

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/

Как я мог достигнуть этого?

3
задан 8 March 2018 в 17:41

3 ответа

Не делать. Вместо этого заставьте 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 можно указать файлы, которые будут извлечены. С tar GNU можно также использовать подстановочные знаки.

3
ответ дан 1 December 2019 в 16:18

Команда для получения имени каталога от tar.xz файл:

tar tJvf tar-file-name.tar.xz | head -1 | awk '{print $6}'

Вы должны будете:

  1. Получите имя каталога (например, использующий выше решения) и сохраните его в переменной
  2. распакуйте tar.xz файл (например, tar использования xf команда)
  3. переместите файлы с помощью переменной каталога

Объяснение, как получить имя каталога от a 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 | направляется-1 | awk '{печатают 6$}'

Результаты с:

coreutils-8.22/
  1. tar.bz2 пример для ffmpeg-3.4.2.tar.bz2

    tar tjvf ffmpeg-3.4.2.tar.bz2 | направляется-1 | awk '{печатают 6$}'

Результаты с:

ffmpeg-3.4.2/

Отметьте это bz2 сжатые файлы я использовал tar j флаг

0
ответ дан 1 December 2019 в 16:18

Как этот:

$ tar tf ffmpeg-release-64bit-static.tar.xz | head -1 | cut -d '/' -f1
ffmpeg-3.4.2-64bit-static

Заметьте это GNU tar не требует -j, -z и т.д. это может обнаружить тип архивирования автоматически.

0
ответ дан 1 December 2019 в 16:18

Другие вопросы по тегам:

Похожие вопросы: