У меня есть процесс в моем Dockerfile
с выполнять шагами:
Следовать работы кода до 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/
Как я мог достигнуть этого?
Не делать. Вместо этого заставьте 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 можно указать файлы, которые будут извлечены. С tar GNU можно также использовать подстановочные знаки.
Команда для получения имени каталога от tar.xz
файл:
tar tJvf tar-file-name.tar.xz | head -1 | awk '{print $6}'
Вы должны будете:
Объяснение, как получить имя каталога от a 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 | направляется-1 | awk '{печатают 6$}'
Результаты с:
coreutils-8.22/
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
флаг
Как этот:
$ tar tf ffmpeg-release-64bit-static.tar.xz | head -1 | cut -d '/' -f1
ffmpeg-3.4.2-64bit-static
Заметьте это GNU tar
не требует -j
, -z
и т.д. это может обнаружить тип архивирования автоматически.