Comment lister le contenu de tous les fichiers .zip dans un dossier et grep pour un fichier spécifique?

28

J'ai 348 fichiers zip et je veux trouver un fichier qui se trouve dans l'un des fichiers zip, unzip -lne fonctionne pas avec les caractères génériques?

Comment puis-je lister le contenu de tous les .zipfichiers et à greptravers la liste fusionnée de tous les fichiers contenus dans les zips?

Eduard Florinescu
la source

Réponses:

17

L'utilisation zipinfoest une bonne solution ici. Cependant, en général, chaque fois que vous souhaitez appliquer une commande à une liste de fichiers et que la commande n'accepte pas une liste de fichiers, vous pouvez utiliser une forboucle:

for file in *.zip; do
    unzip -l "$file"
done \
| grep "\.zip\|setup"

Si le fichier que vous recherchez contient des espaces comme your file:, dans l'expression régulière grep, vous devez échapper à chaque espace avec une barre oblique inverse grep "\.zip\|your\ file".

Konrad Rudolph
la source
Fonctionne parfaitement le seul problème est qu'il n'affiche pas le nom du zip,
Eduard Florinescu
J'ai édité votre message et ajouté une expression régulière pour afficher également le nom de fichier où se trouve la configuration, +1 et accepter
Eduard Florinescu
Oh oui, j'avais oublié les citations autour de l'argument unzip, comme c'était embarrassant.
Konrad Rudolph
1
@JaySullivan N'utilisez pas ce code, il échouera pour les chemins contenant des espaces. Ne dirigez jamais la sortie de ls. Vous pouvez utiliser à la findplace.
Konrad Rudolph
12

Vous pouvez utiliser zipinfo. Il est inclus dans l'installation Ubuntu par défaut. Consultez la page de manuel pour plus d'informations.

Par exemple, pour rechercher un modèle setupdans un groupe de fichiers zip dans le répertoire en cours, utilisez cette commande:

find ./ -iname *zip 2> /dev/null -print0 | xargs -0 zipinfo | grep setup
Anwar
la source
J'obtiens un caution: filename not matched: case1.zip... caution: filename not matched: case348.zippour chaque zip, testé sur deux OS Ubuntu, 11.10 et 12.04.
Eduard Florinescu
@EduardFlorinescu Essayez la réponse mise à jour. Bien que la réponse fonctionnait pour moi
Anwar
le problème est que le fichier peut contenir cela setupet il met la même erreur, bien qu'il fonctionne comme ceci:zipinfo -l * | grep "setup"
Eduard Florinescu
J'ai édité la réponse. Je pense qu'il est plus robuste maintenant
Anwar
1
Merci, +1 pour l'effort, mais cela ne fonctionnera toujours pas si le fichier zip a des espaces dans son nom.
Eduard Florinescu
6

Pour répertorier les fichiers dans une archive zip, vous pouvez utiliser la commande suivante.

unzip -l

Pour grep une archive compressée, vous devez utiliser les utilitaires d'archivage compressés conçus pour fonctionner avec ce type de format d'archive.

Pour les archives zip:

zipgrep --help  
usage: zipgrep [egrep_options] pattern zipfile [members...]
Uses unzip and egrep to search the zip members for a string or pattern.

Pour les archives tar:

zgrep --help
Usage: /bin/zgrep [OPTION]... [-e] PATTERN [FILE]...
Look for instances of PATTERN in the input FILEs, using their
uncompressed contents if they are compressed.

OPTIONs are the same as for 'grep'.

Il existe quelques autres outils qui fonctionnent également avec les archives. Vous pouvez diriger la sortie vers grep pour faire la même chose.

zcat
zcat my.archive.zip | grep "some text"

Ou vous pouvez utiliser la fonctionnalité de recherche de ces outils

zless
zmore
nelaaro
la source