web-dev-qa-db-fra.com

Comment visualiser le contenu du fichier tar.gz sans extraire de la ligne de commande?

Je souhaite voir le contenu (liste de fichiers et de dossiers) d'une archive, par exemple un fichier tar.gzsans extraire le.

Existe-t-il des méthodes pour le faire?

229
Avinash Raj

Exécutez la commande ci-dessous dans le terminal pour afficher le contenu d'un fichier tar.gz sans l'extraire:

tar -tf filename.tar.gz

screenshot of listing compressed tarball files in the terminal

247
Avinash Raj

Vous pouvez aussi utiliser vim

vim filename.tar.gz
115
s.m

less peut également ouvrir les archives gz- compressées et non compressées tar. Cela vous donne aussi une jolie sortie de style ls -l:

$ less ~/src/compiz_0.9.7.8-0ubuntu1.6.debian.tar.gz
drwxrwxr-x 0/0               0 2012-09-21 11:41 debian/
drwxrwxr-x 0/0               0 2012-08-09 13:32 debian/source/
-rw-rw-r-- 0/0              12 2012-08-09 13:32 debian/source/format
-rw-rw-r-- 0/0              25 2012-08-09 13:32 debian/libdecoration0-dev.docs
-rw-rw-r-- 0/0              25 2012-08-09 13:32 debian/compiz-dev.docs
-rw-rw-r-- 0/0             347 2012-08-09 13:32 debian/compiz-core.install
-rw-rw-r-- 0/0             125 2012-08-09 13:32 debian/libdecoration0-dev.install
...

Et comme il s'agit de less, vous pouvez le parcourir, le rechercher, etc. Cependant, il échoue lamentablement avec d'autres algorithmes de compression (d'après mon expérience).

40
Oli

Vous pouvez utiliser la commande z suivante: zcatname__, zlessname__, zgrepname__.

Pour afficher un contenu de fichiers, utilisez:

zcat file.gz   

Pour utiliser quelque chose, utilisez:

zgrep test file.gz   

Pour vérifier la différence entre les fichiers, utilisez:

zdiff file1.gz file2.gz

Ce ne sont que quelques exemples, il y en a beaucoup plus.

35
krt

tar '-t drapeau le contenu pour vous. Ajoutez cela à vos autres drapeaux (donc -tvfz pour un tar.gz, -tvfj pour un tar.bz2, etc.) et vous pourrez naviguer sans extraire. De là, vous pouvez extraire des fichiers simples assez facilement

tar -xvfz mybackup.tar.gz path/to/file

Le gros problème avec tar est rappelant tous les autres drapeaux . Donc, je compte généralement sur 7z (du paquet p7Zip-full) pour effectuer tout mon archivage. Je ne prétends pas que c'est tout à fait meilleur, mais il supporte presque tout (sans avoir à spécifier le type de compression) et les arguments sont logiques.

7z l archive.ext
7z e archive.ext path/to/file

C'est certainement moins capable, mais vous n'avez pas besoin de la page de manuel pour l'utiliser.

Il y a aussi Midnight Commander (mc). Il s’agit d’une solution polyvalente pour la gestion de fichiers quasi-graphique basée sur un terminal et, avec quelques essais, elle vous permet simplement de parcourir les archives .tar.gz et .7z. Je ne suis pas sûr de combien d'autres il prend en charge.

9
Oli

Cela dépend du fichier. La plupart des programmes de (dé) compression ont un indicateur qui répertorie le contenu d'une archive.

  1. tar/tar.gz/tgz/tar.xz/tar.bz2/tbz fichiers

    $ tar tf foo.tgz 
    dir1/
    dir1/subdir1/
    dir1/subdir1/file
    dir1/subdir2/
    dir1/subdir2/file
    dir2/
    
  2. Zip fichiers

    $ Zip -sf foo.Zip 
    Archive contains:
      dir1/
      dir2/
      dir1/subdir1/
      dir1/subdir1/file
      dir1/subdir2/
      dir1/subdir2/file
    Total 6 entries (0 bytes)
    
  3. Fichiers 7Zip

    $ 7z l foo.7z 
    
    7-Zip [64] 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18
    p7Zip Version 9.20 (locale=en_US.utf8,Utf16=on,HugeFiles=on,4 CPUs)
    
    Listing archive: foo.7z
    
    --
    Path = foo.7z
    Type = 7z
    Solid = -
    Blocks = 0
    Physical Size = 168
    Headers Size = 168
    
       Date      Time    Attr         Size   Compressed  Name
    ------------------- ----- ------------ ------------  ------------------------
    2015-03-30 19:00:07 ....A            0            0  dir1/subdir1/file
    2015-03-30 19:00:07 ....A            0            0  dir1/subdir2/file
    2015-03-30 19:07:32 D....            0            0  dir2
    2015-03-30 19:00:07 D....            0            0  dir1/subdir2
    2015-03-30 19:00:07 D....            0            0  dir1/subdir1
    2015-03-30 19:00:06 D....            0            0  dir1
    ------------------- ----- ------------ ------------  ------------------------
                                         0            0  2 files, 4 folders
    
  4. rar fichiers

     $ rar v foo.rar 
    
    RAR 4.20   Copyright (c) 1993-2012 Alexander Roshal   9 Jun 2012
    Trial version             Type RAR -? for help
    
    Archive foo.rar
    
    Pathname/Comment
                      Size   Packed Ratio  Date   Time     Attr      CRC   Meth Ver
    -------------------------------------------------------------------------------
     dir1/subdir1/file
                         0        8   0% 30-03-15 19:00 -rw-r--r-- 00000000 m3b 2.9
     dir1/subdir2/file
                         0        8   0% 30-03-15 19:00 -rw-r--r-- 00000000 m3b 2.9
     dir1/subdir1
                         0        0   0% 30-03-15 19:00 drwxr-xr-x 00000000 m0  2.0
     dir1/subdir2
                         0        0   0% 30-03-15 19:00 drwxr-xr-x 00000000 m0  2.0
     dir1
                         0        0   0% 30-03-15 19:00 drwxr-xr-x 00000000 m0  2.0
     dir2
                         0        0   0% 30-03-15 19:07 drwxr-xr-x 00000000 m0  2.0
    -------------------------------------------------------------------------------
        6                0       16   0%
    

C'est la plupart des formats d'archives les plus populaires. En gardant tout cela à l’esprit, vous pourriez écrire un petit script qui utilise la commande appropriée en fonction de l’extension du fichier que vous lui donnez:

#!/usr/bin/env bash

for file in "$@"
do
    printf "\n-----\nArchive '%s'\n-----\n" "$file"
    ## Get the file's extension
    ext=${file##*.}
    ## Special case for compressed tar files. They sometimes
    ## have extensions like tar.bz2 or tar.gz etc.
    [[ "$(basename "$file" ."$ext")" =~ \.tar$ ]] && ext="tgz"

    case $ext in
        7z)
            type 7z >/dev/null 2>&1 && 7z l "$file" || 
            echo "ERROR: no 7z program installed"
            ;;
        tar|tbz|tgz)
            type tar >/dev/null 2>&1 && tar tf "$file"|| 
            echo "ERROR: no tar program installed"
            ;;
        rar)
            type rar >/dev/null 2>&1 && rar v "$file"|| 
            echo "ERROR: no rar program installed"
            ;;
        Zip)
            type Zip >/dev/null 2>&1 && Zip -sf "$file"|| 
            echo "ERROR: no Zip program installed"
            ;;
        *)
            echo "Unknown extension: '$ext', skipping..."
            ;;
    esac
done

Enregistrez ce script dans votre PATH et rendez-le exécutable. Vous pouvez ensuite lister le contenu de n'importe quelle archive:

$ list_archive.sh foo.rar foo.tar.bz foo.tar.gz foo.tbz foo.Zip

-----
Archive 'foo.rar'
-----

RAR 4.20   Copyright (c) 1993-2012 Alexander Roshal   9 Jun 2012
Trial version             Type RAR -? for help

Archive foo.rar

Pathname/Comment
                  Size   Packed Ratio  Date   Time     Attr      CRC   Meth Ver
-------------------------------------------------------------------------------
 dir1/subdir1/file
                     0        8   0% 30-03-15 19:00 -rw-r--r-- 00000000 m3b 2.9
 dir1/file
                     0        8   0% 30-03-15 19:29 -rw-r--r-- 00000000 m3b 2.9
 dir1/subdir1
                     0        0   0% 30-03-15 19:00 drwxr-xr-x 00000000 m0  2.0
 dir1
                     0        0   0% 30-03-15 19:29 drwxr-xr-x 00000000 m0  2.0
 dir2
                     0        0   0% 30-03-15 19:07 drwxr-xr-x 00000000 m0  2.0
-------------------------------------------------------------------------------
    5                0       16   0%


-----
Archive 'foo.tar.bz'
-----
dir1/
dir1/subdir1/
dir1/subdir1/file
dir1/file
dir2/

-----
Archive 'foo.tar.gz'
-----
dir1/
dir1/subdir1/
dir1/subdir1/file
dir1/file
dir2/

-----
Archive 'foo.tbz'
-----
dir1/
dir1/subdir1/
dir1/subdir1/file
dir1/file
dir2/

-----
Archive 'foo.Zip'
-----
Archive contains:
  dir1/
  dir1/subdir1/
  dir1/subdir1/file
  dir1/file
  dir2/
Total 5 entries (0 bytes)

Et puisque quelqu'un a mentionné que l'éditeur inférieur, naturellement, emacs peut aussi le faire:

emacs showing an archive's contents

9
terdon

Pourquoi ne pas utiliser vim pour parcourir vos archives et ouvrir les fichiers (au moins des fichiers de type texte):

vim archive.tar.gz

enter image description here

Appuyez sur les touches fléchées pour faire défiler et Enter ouvrir un fichier.

6
Sylvain Pineau

Midnight Commander (mc) possède également un bon visualiseur de fichiers compressé, bien que je considère cela un peu comme de la triche, car mc est un gestionnaire de fichiers, même s'il est basé sur du texte.

De plus, si tout ce que vous voulez, c'est voir ce qu'il y a dans les archives compressées, vous pouvez apprendre la commande "view" pour chaque compresseur. tar tzvf vous montrera le contenu d'un fichier tar, unzip -l le fera pour un fichier Zip, et ainsi de suite.

4
roadmr

Utiliser view filename.tar.gz fonctionnera également. de la même manière que vim, mais sans les permissions d’écriture.

2
Jeff

lesspipe est un script shell installé par défaut dans le package less qui peut répertorier le contenu d'une archive tar.gz ainsi que toute une gamme d'autres formats de fichiers d'archives courants.

$ lesspipe example.tar.gz
drwxrwxr-x ubuntu/ubuntu     0 2018-11-16 05:32 example/
-rw-rw-r-- ubuntu/ubuntu     7 2018-11-16 05:32 example/ask.txt
-rw-rw-r-- ubuntu/ubuntu     7 2018-11-16 05:32 example/ubuntu.txt

Il est appelé par la commande less ( voir la réponse de Oli ) en tant que préprocesseur d'entrée si la variable d'environnement $LESSOPEN est définie correctement.

Si vous vous sentez aventureux, prenez un maximum à vi /usr/bin/lesspipe pour voir quelles commandes il utilise. Pour les fichiers correspondant à l'extension tar.gz, nous pouvons voir qu'il utilise tar tzvf sous le capot avec l'option --force-local pour désactiver une fonction obscure de tar qui autrement confondrait deux points dans le nom du fichier avec une commande d'utilisation lecteur de bande distant:

*.tar.gz|*.tgz|*.tar.z|*.tar.dz)
        tar tzvf "$1" --force-local

Notez que, comme il est principalement conçu comme préprocesseur pour less, il ne restituera rien s'il ne reconnaît pas le type de fichier. J'ai remarqué que certains fichiers .tar.gz que j'avais téléchargés ne fonctionnaient pas car ils n'utilisaient pas la compression gzip malgré le nom du fichier.

2
anjsimmo

Si vous souhaitez afficher le contenu d'un fichier spécifique dans une archive sans extraire l'archive ni écrire sur le disque, utilisez l'indicateur -O (capital o) pour écrire sur stdout au lieu d'un fichier.

tar -Oxvf gerald.tar.gz /path/to/sandra.txt | less

Assurez-vous que le O vient avant le f ou il essaiera d'analyser le O comme un nom de fichier.

0
Mobus Dorphin