198 votes

Lister les fichiers avec certaines extensions avec ls et grep

Je veux juste récupérer les fichiers du répertoire courant et ne sortir que les fichiers .mp4 .mp3 .exe, rien d'autre. J'ai donc pensé que je pourrais simplement faire ceci :

ls | grep \.mp4$ | grep \.mp3$ | grep \.exe$

Mais non, comme le premier grep ne donnera que des mp4, les deux autres grep ne seront pas utilisés.

Des idées ? PS, j'exécute ce script sur Slow Leopard.

1 votes

C'est vraiment la mauvaise approche -- au lieu d'utiliser grep, utilisez shopt -s nullglob et ensuite juste se référer à *.exe *.mp3 *.mp4 . Voir mywiki.wooledge.org/ParsingLs

3 votes

Je n'arrive pas à savoir si "Slow Leopard" est une faute de frappe ou non...

1 votes

@Wowfunhappy hahaha, c'était certainement une faute de frappe, je me souviens avoir pensé que Snow Leopard était assez rapide.

422voto

meder Points 81864

Pourquoi pas :

ls *.{mp3,exe,mp4}

Je ne sais pas où j'ai appris ça, mais je l'utilise depuis longtemps.

1 votes

Cela ne fonctionne pas pour moi car l'extension que j'utilise est pour un répertoire, donc le ls liste le contenu du répertoire.

1 votes

@RichardVenable ajoutez le commutateur -d pour empêcher que les répertoires soient récurrents.

14 votes

J'aime cette solution mais elle semble échouer s'il manque un des types de fichiers. Par exemple, vous avez des mp3 mais pas de .exe (Mac OSX, zsh).

56voto

mob Points 61524

egrep -- grep étendu -- va aider ici

ls | egrep '\.mp4$|\.mp3$|\.exe$'

devrait faire l'affaire.

0 votes

C'est ça ! Merci Je viens de réaliser que j'aurais dû le faire sans tenir compte de la casse, donc j'utilise : ls | egrep -i ' \.mp4 $| \.mp3 $| \.exe Au cas où quelqu'un aurait besoin d'aide pour ça un jour. Je suis toujours surpris par la vitesse à laquelle j'obtiens ma réponse ici.

0 votes

Je ne vois pas comment cela pourrait fonctionner. ls sans aucune option produit une sortie en colonnes. L'ancrage à la fin de la ligne ne correspondra pas correctement.

4 votes

@camh : ls dans un terminal (ou avec -C ) produit une sortie multi-colonnes. ls vers un tuyau (ou avec -1 ) a une sortie à une seule colonne. (Comparez la sortie de ls con ls | cat ).

46voto

Dennis Williamson Points 105818

Utilisez les expressions régulières avec find :

find . -iregex '.*\.\(mp3\|mp4\|exe\)' -printf '%f\n'

Si vous mettez les noms de fichiers dans le pipeline :

find . -iregex '.*\.\(mp3\|mp4\|exe\)' -printf '%f\0' | xargs -0 dosomething

Cela protège les noms de fichiers qui contiennent des espaces ou des nouvelles lignes.

OS X find ne prend en charge l'alternance que lorsque le -E (amélioré) est utilisée.

find -E . -regex '.*\.(mp3|mp4|exe)'

2 votes

Sur Mac OS X : find . -iregex '.*\(mp3\|mp4\|exe\)'

4 votes

Andi, ça n'a pas marché pour moi sur mac os. Mais ceci a fonctionné : find -E . -regex ".*(mp3|mp4|exe)

0 votes

Cette solution chargera des fichiers comme : mysupermp3.jpg envisager d'ajouter le $ à la fin de la regex et l'élément \\. avant les extensions

19voto

Joshua Kersey Points 273

Le moyen le plus simple est d'utiliser ls

ls *.mp4 *.mp3 *.exe

2 votes

Merci, mais j'ai déjà essayé ça et je n'ai pas aimé les erreurs que vous obtenez quand il n'y a pas de fichier. J'aurais pu résoudre ce problème en faisant : ls *.mp4 *.mp3 *.exe 2> /dev/null Je n'y ai pensé que maintenant :P

1 votes

Je suis surpris que ls n'a pas une sorte d'option silencieuse.

3 votes

En bash, vous pouvez faire "set -o nullglob", et vous n'aurez pas les erreurs.

13voto

camh Points 13169

Pas besoin de grep. Les caractères génériques de l'interpréteur de commandes feront l'affaire.

ls *.mp4 *.mp3 *.exe

Si vous avez exécuté

shopt -s nullglob

alors les globs qui ne correspondent pas seront supprimés complètement et ne seront pas laissés sur la ligne de commande sans être étendus.

Si vous voulez un regroupement insensible à la casse (ainsi *.mp3 correspondra à foo.MP3) :

shopt -s nocaseglob

0 votes

Même commentaire que celui que j'ai donné à Good Time Tribe.

2 votes

J'essaie de l'utiliser avec le -R pour lister les fichiers correspondants dans les sous-répertoires mais l'option ne semble pas avoir d'effet et je n'obtiens toujours que les résultats du répertoire courant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X