Jak mogę zrobić `dir * .mp3` w bash?

3

W systemie Windows szybko uruchamiałem a, dir *.mp3aby znaleźć wszystkie pliki z rozszerzeniem mp3 w bieżącym katalogu. Czy istnieje podobnie szybki sposób na bash? lsPolecenia wydaje się mieć drogę do ignorowania wzór, ale nie pokazują tylko wzór. Mogę zrobić find . -maxdepth 1 -iname '*.mp3'albo ls|grep -i '\.mp3$', ale żadna z nich nie wypływa z moich palców w pół sekundy lub mniej)

Jakieś szybsze alternatywy?

Andy
źródło
Zauważ, że to interpreter (bash) zastępuje symbole wieloznaczne. W związku z tym ls *.mp3może spowodować powstanie bardzo długiej listy (zbyt długiej pamięci / wiersza poleceń), w zależności od liczby plików pasujących do wzorca globowania. bashfaktycznie wywołuje „ ls aGoodSong1.mp3 boringSong2.mp3 coolSong.mp3” (jeśli masz te 3 pliki). Obejście: ls | grep -i '[.]mp3$'(gdzie ls wyświetla wszystkie pliki, a grep pokazuje tylko pliki .mp3)
MattBianco,
Dla zabawy spróbujecho *.mp3
MattBianco,

Odpowiedzi:

10

Próbowałeś ls *.mp3?

mouviciel
źródło
2
Och, to trochę dziwne. To działa! Jestem pewien , że to była pierwsza rzecz, którą próbowałem w przeszłości. Czy jest jakaś sytuacja, w której to nie działa? Dzięki za odpowiedź :)
Andy
Tak, nie wyświetla plików „* .MP3”. Musisz użyć grep -i, aby zignorować przypadek
kolypto
2
Albo po prostu zróbls *.mp3 *.MP3
Paul R
... ale: ls *. [mM] [pP] 3 będzie.
JRobert
Od pewnego czasu zamierzam o tym pisać. Może to był problem z dir /s *.mp3... tak czy inaczej, dzięki za odpowiedź!
Andy,
0

Zauważ, że w bash , symbol wieloznaczny gwiazdy jest rozstrzygany przez interpreter wiersza poleceń, zanim wynikowa tablica ciągów znaków jest następnie przekazywana do właściwego polecenia. W wierszu poleceń systemu Windows (ex-DOS) symbol wieloznaczny gwiazdy jest przekazywany do polecenia „tak jak jest”, które następnie niestety musi sobie z tym poradzić. Zobacz wpis w Wikipedii dotyczący globowania

Spróbuj tego, aby zobaczyć, jak zachowuje się symbol wieloznaczny:

#!/bin/bash    
# Display all "positional parameters" (as they are called), passed to the script:    
# COUNT is the number of positional paramaters

COUNT=$#    
while [[ $COUNT -gt 0 ]]; do
   echo "'$1'"
   # pop positional argument 1 off the stack of positional arguments
   shift
   let COUNT=$COUNT-1
done
David Tonhofer
źródło