fichiers de liste tar uniquement


16

Fait amusant: si vous utilisez Archive Manager et extrayez un fichier .tar.gz afin de ne pas cocher "Garder la structure du répertoire", vous obtiendrez une tarbomb .

tar -ztfrépertorie tous les fichiers et répertoires dans un fichier tar. Existe-t-il un moyen de répertorier tous les fichiers dans un fichier tar, sans la structure du répertoire?


Vous pouvez obtenir l'effet «tarbomb» avec tar xvzf my_tar.tar.gz --transform 's/.*\///'. Mais malheureusement, cela ne change pas la façon dont il s'affiche dans une liste avec tplutôt que x.
ire_and_curses

4
Ce qui me dérange, c'est que même des archives bien structurées peuvent si facilement être utilisées pour créer des armes d'extraction massive.
Eero Aaltonen

Réponses:


17

Je ne vois pas de moyen de le faire à partir de la page de manuel, mais vous pouvez toujours filtrer les résultats. Ce qui suit ne suppose aucune nouvelle ligne dans vos noms de fichiers:

tar tzf your_archive | awk -F/ '{ if($NF != "") print $NF }'

Comment ça fonctionne

En définissant le séparateur de champ sur /, le dernier champ awkconnu ( $NF) est soit le nom de fichier s'il traite un nom de fichier, soit vide s'il traite un nom de répertoire ( tarajoute une barre oblique de fin aux noms de répertoire). Donc, nous disons essentiellement awkd'imprimer le dernier champ s'il n'est pas vide.


Très beau travail avec awk :)
Eero Aaltonen

5

En utilisant l'une suggestion de Joseph R. peut utiliser l'expression rationnelle [^/]$à grepdes fichiers en recherchant des lignes ne se termine pas avec /.

tar tzf archive.tar.gz | grep -e "[^/]$"


Cela produit toujours foo/barpar opposition à juste bar. Vous voulez grep -Eo '[^/]+$'(avec GNU grep).
Stéphane Chazelas

4

En supposant qu'aucun des noms de fichier ne contient de nouvelle ligne:

tar -tf foo.tar | sed -e 's#.*/##' -e '\#.#!d'

La première commande sed supprime tout avant le dernier /d'une ligne, de sorte que seule la partie du nom de fichier est imprimée. La deuxième commande supprime les lignes qui sont maintenant vides, c'est-à-dire les lignes qui se terminent par a /, qui sont des répertoires.


sed: -e expression # 2, char 2: commande inconnue: `/ 'et la syntaxe sed ne semble pas très .. intuitive
Eero Aaltonen

@EeroAaltonen J'ai corrigé la commande sed. En effet, la syntaxe est quelque peu cryptique (j'inclus des explications dans ma réponse).
Gilles 'SO- arrête d'être méchant'

2

Avec pax(la commande POSIX pour lire les tarfichiers):

pax -'s@.*/@@' < file.tar

(qui répertorie tous les fichiers quel que soit leur type, y compris les répertoires).

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.