web-dev-qa-db-fra.com

Comment grep pour une extension de fichier

J'essaie actuellement de créer un script qui permettrait à grep d'entrer si quelque chose est d'un certain type de fichier (Zip par exemple), bien que le texte précédant le type de fichier puisse être n'importe quoi, par exemple

something.Zip
this.Zip
that.Zip

tomberaient tous dans la catégorie. J'essaie de les utiliser en utilisant un caractère générique, et jusqu'à présent, j'ai essayé

grep ".*.Zip"

Mais chaque fois que je le fais, les fichiers .Zip seront trouvés comme il convient, mais ils afficheront quand même des résultats s'il y a des caractères supplémentaires après le .Zip. Ainsi, par exemple, .zippppppp ou .zipdsjdskjc serait toujours récupéré par grep. Cela dit, que dois-je faire pour empêcher grep d’afficher des correspondances comportant des caractères supplémentaires après le .Zip

14
lacrosse1991

Testez la fin de la ligne avec $ et échappez le second . avec une barre oblique inversée afin qu'elle ne corresponde qu'à un point et non à un caractère.

grep ".*\.Zip$"

Cependant, ls *.Zip est un moyen plus naturel de procéder si vous souhaitez répertorier tous les fichiers .Zip du répertoire actuel ou find . -name "*.Zip" pour tous les fichiers .Zip des sous-répertoires à partir de (et notamment) le répertoire actuel. 

46
Chris Seymour

Sous UNIX, essayez:

find . -name \*.Zip -print
14
Student

Vous devez faire quelques choses. Ça devrait ressembler à ça:

grep '.*\.Zip$'

Vous devez échapper au second point, il ne fera donc que correspondre à un point et non à un caractère. L'utilisation de guillemets simples facilite l'échappement.

Vous avez besoin du signe dollar en fin de ligne pour indiquer que vous souhaitez que le "Zip" apparaisse en fin de ligne.

5
Vaughn Cato

J'utilise ceci pour obtenir une liste des types de fichiers dans un dossier. 

find . -type f | egrep -i -E -o "\.{1}\w*$" | sort -su

Sorties par exemple:

.DS_Store
.MP3
.aif
.aiff
.asd
.doc
.flac
.jpg
.m4a
.m4p
.m4r
.mp3
.pdf
.png
.txt
.wav
.wma
.Zip

BONUS: avec

find . -type f | egrep -i -E -o "\.{1}\w*$" | sort | uniq -c

Vous obtiendrez le nombre de fichiers:

    106 .DS_Store
     35 .MP3
     89 .aif
      5 .aiff
    525 .asd
      1 .doc
     60 .flac
     48 .jpg
    149 .m4a
     11 .m4p
      1 .m4r
  12844 .mp3
      1 .pdf
      5 .png
      9 .txt
    108 .wav
     44 .wma
      2 .Zip
2
index opout

Essayez: grep -o -E "(\\.([A-z])+)+"

J'ai utilisé cela pour obtenir des extensions multi-pointées/multiples. Ainsi, si l'entrée était hello.tar.gz, elle générerait .tar.gz. Pour les points uniques, utilisez grep -o -E "\\.([A-z])+$". Tested on Cygwin/MingW + MSYS.

2
dsrdakota

Vous pouvez également utiliser grep pour trouver tous les fichiers avec une extension spécifique:

find .|grep -e "\.gz$"

Le . signifie le dossier en cours. Si vous voulez spécifier un dossier autre que le dossier actuel, remplacez simplement le . par le chemin du dossier . Voici un exemple: Permet de rechercher tous les fichiers se terminant par .gz et se trouvant dans le dossier/var/bûche

  find /var/log/ |grep -e "\.gz$"

La sortie ressemble à ce qui suit:

 ✘ ⚙> find /var/log/ |grep -e "\.gz$"

/var/log//mail.log.1.gz
/var/log//mail.log.0.gz
/var/log//system.log.3.gz
/var/log//system.log.7.gz
/var/log//system.log.6.gz
/var/log//system.log.2.gz
/var/log//system.log.5.gz
/var/log//system.log.1.gz
/var/log//system.log.0.gz
/var/log//system.log.4.gz

Le signe $ indique en gros que l'extension du fichier se termine par gz

2
Stryker

Je passe en revue certaines des autres réponses. Le .* n'est pas nécessaire, et si vous recherchez une certaine extension de fichier, mieux vaut inclure -i pour qu'il ne respecte pas la casse; dans le cas où le fichier est HELLO.Zip, par exemple. Je ne pense pas que les citations sont nécessaires, non plus.

grep -i \.Zip$
1
twasbrillig

Un autre correctif/addon de l'exemple ci-dessus:

# multi-dotted/multiple extensions
grep -oEi "(\\.([A-z0-9])+)+" file.txt

# single dotted
grep -oEi "\\.([A-z0-9])+$" file.txt

Cela aura des extensions de fichiers comme '.mp3' et etc.

1
browseman

Faites simplement:

grep ".*.Zip$"

Le "$" indique la fin de la ligne

0
AaronO