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?

Eero Aaltonen
la source
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.

Joseph R.
la source
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 "[^/]$"

user116835
la source
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.

Gilles 'SO- arrête d'être méchant'
la source
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).

Stéphane Chazelas
la source