web-dev-qa-db-fra.com

Lister tous les fichiers d'archive

Comment puis-je obtenir la liste de tous les fichiers d'archive dans un dossier de manière récursive sans connaître l'extension du fichier?

2
Sceptical Jule

Vous pouvez utiliser l'utilitaire file pour tenter de classer un fichier en fonction d'une séquence de tests de système de fichiers, de tests magiques et de tests de langue - par exemple

$ file pynauty-0.5.tar 
pynauty-0.5.tar: POSIX tar archive (GNU)

$ file opencv-2.4.10.Zip
opencv-2.4.10.Zip: Zip archive data, at least v1.0 to extract

Lorsqu'il est exécuté sur des fichiers compressés, la valeur par défaut consiste simplement à signaler qu'il contient des "données compressées", mais vous pouvez modifier ce comportement à l'aide de -z commutateur

 -z, --uncompress
         Try to look inside compressed files.

c'est à dire.

$ file -b octave-4.0.0.tar.gz 
gzip compressed data, from Unix, last modified: Tue May 26 12:35:47 2015, max compression

tandis que

$ file -zb octave-4.0.0.tar.gz 
POSIX tar archive (gzip compressed data, from Unix, last modified: Tue May 26 12:35:47 2015, max compression)

Sur cette base, vous pouvez essayer d'exécuter file -zb dans une commande find et greping pour le mot "archive": quelque chose comme

find . -type f -exec sh -c 'file -zb "$1" | grep -q "archive"' _ {} \; -print

Le -b switch empêche les fausses correspondances sur le nom de fichier.

2
steeldriver

Vous pouvez vérifier le type de fichier avec cette commande pour une archive/fichier sans extension:

% file tar-latest            
tar-latest: XZ compressed data

ou un autre exemple:

% file foo          
foo: Zip archive data, at least v2.0 to extract

Pour lister toutes les archives

find . -type f -exec file {} \; | awk '/compressed|archive/'

Exemple

% find . -type f -exec file {} \; | awk '/compressed|archive/'
./tar-latest: XZ compressed data
./foo: Zip archive data, at least v2.0 to extract
0
A.B.