Como faço para obter o nome do diretório ou arquivo depois de extrair depois de um arquivo tar?

3

Eu tenho um processo no meu Dockerfile com as seguintes etapas:

  1. Faça o download do arquivo tar usando o wget.
  2. descompacte o arquivo.
  3. Execute alguma operação com o arquivo. Nesse caso, mova o conteúdo para outro lugar.

O código a seguir funciona até ffmpeg versão ainda 3.4.1. Então, hoje a versão disponível para ffmpeg é 3.4.2 e o código não está funcionando.

Eu quero encontrar uma maneira de recuperar o nome do arquivo após o processo untar e passá-lo para as próximas etapas

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/  

Pode ser algo assim:

RUN DIRNAME = tar xf ffmpeg-release-64bit-static.tar.xz
RUN mv $DIRNAME/ffmpeg /usr/local/bin/
RUN mv $DIRNAME/ffprobe /usr/local/bin/

Como eu poderia conseguir isso?

    
por zwitterion 08.03.2018 / 14:39

3 respostas

3

Não. Em vez disso, obtenha tar para colocar o conteúdo em um diretório de sua escolha.

  1. tar pode remover os componentes n do caminho de cada arquivo ( --strip-components )
  2. tar pode aplicar expressões arbitrárias de sed para alterar o caminho de cada arquivo ( --transform )

Então, eu faria algo como:

mkdir ffmpeg
wget -O - http://johnvansickle.com/ffmpeg/releases/ffmpeg-release-64bit-static.tar.xz |
  tar --xz -x -C ffmpeg --strip-components=1

Aqui, eu mesmo fiz o diretório e disse ao tar para extraí-lo (a opção -C ), enquanto removia o primeiro componente do caminho dos arquivos extraídos. Então, ffmpeg-3.4.1-64bit-static/ffprobe se torna ffprobe dentro do diretório ffmpeg .

Ou:

wget -O - http://johnvansickle.com/ffmpeg/releases/ffmpeg-release-64bit-static.tar.xz |
  tar --xz -x --transform='s:[^/]*/:ffmpeg/'

Aqui, eu simplesmente mudei o primeiro componente do caminho para ffmpeg , então não precisei fazer o diretório sozinho. Então, ffmpeg-3.4.1-64bit-static/ffmpeg se torna ffmpeg/ffmpeg .

Ou, sabendo que você quer despejar especificamente esses arquivos específicos em /usr/local/bin , use -C para colocar diretamente os arquivos lá, enquanto remove todos os componentes do diretório e seleciona exatamente os arquivos que deseja extrair:

wget -O - http://johnvansickle.com/ffmpeg/releases/ffmpeg-release-64bit-static.tar.xz |
  tar Jx -C /usr/local/bin --transform='s:.*/::' --wildcards '*/ffmpeg' '*/ffprobe'

Com qualquer tar, você pode especificar os arquivos a serem extraídos. Com o GNU tar, você também pode usar curingas.

    
por muru 08.03.2018 / 15:36
0

O comando para obter o nome do diretório do arquivo tar.xz é:

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

Você precisará:

  1. Obtenha o nome do diretório (por exemplo, usando a solução acima) e salve-o em uma variável
  2. descompacte o arquivo tar.xz (por exemplo, usando o comando tar xf)
  3. mova os arquivos usando a variável de diretório

Explicação de como obter o nome do diretório a partir de um arquivo tar :

Parâmetros do alcatrão:

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

head -1 - imprime a linha do arquivo

awk '{print }' - imprima os 6º elementos que são o nome do diretório

Exemplos:

  1. tar.xz exemplo:

    tar tJvf coreutils-8.22.tar.xz | cabeça -1 | awk '{print $ 6}'

Resultados com:

coreutils-8.22/
  1. tar.bz2 example para ffmpeg-3.4.2.tar.bz2

    tar tjvf ffmpeg-3.4.2.tar.bz2 | cabeça -1 | awk '{print $ 6}'

Resultados com:

ffmpeg-3.4.2/
  

Observe que, para bz2 arquivos compactados, usei o tar j flag

    
por Yaron 08.03.2018 / 14:48
0

Assim:

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

Observe que GNU tar não exige -j , -z etc., pode detectar o tipo de arquivo automaticamente.

    
por Arkadiusz Drabczyk 08.03.2018 / 14:59