Je veux juste obtenir les fichiers du répertoire en cours et ne générer que les fichiers .mp4, .mp3 et autres .exe. Alors j'ai pensé que je pouvais faire ça:
ls | grep \.mp4$ | grep \.mp3$ | grep \.exe$
Mais non, comme le premier grep ne produira que les fichiers mp4, les 2 autres grep ne seront pas utilisés.
Des idées? PS, Exécution de ce script sur Slow Leopard.
Pourquoi pas:
ls *.{mp3,exe,mp4}
Je ne sais pas où je l'ai appris - mais je l'utilise.
Utilisez des expressions régulières avec find
:
find . -iregex '.*\.\(mp3\|mp4\|exe\)' -printf '%f\n'
Si vous pipez les noms de fichiers:
find . -iregex '.*\.\(mp3\|mp4\|exe\)' -printf '%f\0' | xargs -0 dosomething
Cela protège les noms de fichiers contenant des espaces ou des nouvelles lignes.
OS X find
ne prend en charge l'alternance que lorsque l'option -E
(amélioré) est utilisée.
find -E . -regex '.*\.(mp3|mp4|exe)'
egrep
- grep étendu - aidera ici
ls | egrep '\.mp4$|\.mp3$|\.exe$'
devrait faire le travail.
le plus simple est d'utiliser simplement ls
ls *.mp4 *.mp3 *.exe
Juste au cas où: pourquoi n'utilisez-vous pas find
?
find -iname '*.mp3' -o -iname '*.exe' -o -iname '*.mp4'
Pas besoin de grep. Shell wildcards fera l'affaire.
ls *.mp4 *.mp3 *.exe
Si vous avez couru
shopt -s nullglob
alors les globs sans correspondance seront complètement supprimés et ne seront pas laissés sur la ligne de commande non expansés.
Si vous souhaitez que la globbing ne respecte pas la casse (donc * .mp3 correspond à foo.MP3):
shopt -s nocaseglob
Si vous recherchez toujours une solution alternative:
ls | grep -i -e '\\.tcl$' -e '\\.exe$' -e '\\.mp4$'
N'hésitez pas à ajouter plus de drapeaux -e si nécessaire.
Pour les utilisateurs OSX:
Si vous utilisez ls *.{mp3,exe,mp4}
, , une erreur sera générée si l'une de ces extensions n'a aucun résultat.
L'utilisation de ls *.(mp3|exe|mp4)
renvoie tous les fichiers correspondant à ces extensions , même si l'une des extensions avait 0 résultat .
ls | grep "\.mp4$
\.mp3$
\.exe$"
ls -R | findstr ".mp3"
ls -R
=> liste les sous-répertoires de manière récursive
Voici un exemple qui a fonctionné pour moi.
find <mainfolder path> -name '*myfiles.Java' | xargs -n 1 basename