web-dev-qa-db-fra.com

Comment obtenir par programme le nom du fichier ou du répertoire après son extraction après une archive tar?

J'ai un processus dans mon Dockerfile avec les étapes suivantes:

  1. Téléchargez le fichier tar à l'aide de wget.
  2. décompresser le fichier.
  3. Effectuer une opération avec le fichier. Dans ce cas, déplacez le contenu vers un autre endroit.

Le code suivant fonctionne jusqu'à ce que ffmpeg version soit toujours 3.4.1. Donc, aujourd'hui, la version disponible pour ffmpeg est 3.4.2 et le code ne fonctionne pas.

Je veux trouver un moyen de récupérer le nom du fichier après le processus untar et de le transmettre aux étapes suivantes.

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/  

Cela pourrait être quelque chose comme ça:

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

Comment pourrais-je y parvenir?

3
zwitterion

Ne pas Au lieu de cela, demandez à tar de placer le contenu dans un répertoire de votre choix.

  1. tar peut supprimer n composants du chemin de chaque fichier (--strip-components)
  2. tar peut appliquer des expressions sed arbitraires pour changer le chemin de chaque fichier (--transform)

Donc, je ferais quelque chose comme:

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

Ici, j’ai fait le répertoire moi-même et j’ai dit à tar d’y extraire (option -C) tout en supprimant le premier composant du chemin des fichiers extraits. Ainsi, ffmpeg-3.4.1-64bit-static/ffprobe devient ffprobe dans le répertoire ffmpeg.

Ou:

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

Ici, j'ai simplement changé le premier composant du chemin en ffmpeg, donc je n'avais pas besoin de créer le répertoire moi-même. Ainsi, ffmpeg-3.4.1-64bit-static/ffmpeg devient ffmpeg/ffmpeg.

Ou, sachant que vous souhaitez spécifiquement exporter ces fichiers particuliers dans /usr/local/bin, utilisez -C pour y placer directement les fichiers, tout en supprimant tous les composants du répertoire et en sélectionnant exactement les fichiers à extraire:

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

Avec n'importe quel tar, vous pouvez spécifier les fichiers à extraire. Avec GNU tar, vous pouvez également utiliser des caractères génériques.

3
muru

La commande pour obtenir le nom du répertoire à partir du fichier tar.xz est la suivante:

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

Vous aurez besoin de:

  1. Obtenez le nom du répertoire (en utilisant la solution ci-dessus, par exemple) et enregistrez-le dans une variable.
  2. décompressez le fichier tar.xz (par exemple, à l'aide de la commande tar xf)
  3. déplacer les fichiers en utilisant la variable de répertoire

Explication sur la façon d’obtenir le nom du répertoire à partir d’un fichier tar:

Paramètres de goudron:

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

head -1 - imprime la ligne du fichier

awk '{print $6}' - affiche le 6ème élément qui est le nom du répertoire


Exemples:

  1. tar.xz exemple:

    tar tJvf coreutils-8.22.tar.xz | tête -1 | awk '{print $ 6}'

Résultats avec:

coreutils-8.22/
  1. tar.bz2 exemple pour ffmpeg-3.4.2.tar.bz2

    tar tjvf ffmpeg-3.4.2.tar.bz2 | tête -1 | awk '{print $ 6}'

Résultats avec:

ffmpeg-3.4.2/

Notez que pour bz2 fichiers compressés, j'ai utilisé l'indicateur tarj.

0
Yaron

Comme ça:

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

Notez que GNU tar ne nécessite pas -j, -z etc., il peut détecter automatiquement le type d'archive.

0