Chcę tylko pobrać pliki z bieżącego katalogu i wyprowadzić tylko pliki .mp4 .mp3 .exe nic więcej. Pomyślałem więc, że mogę to zrobić:
ls | grep \.mp4$ | grep \.mp3$ | grep \.exe$
Ale nie, ponieważ pierwszy grep wyświetli tylko pliki mp4, dlatego pozostałe 2 grep nie będą używane.
Jakieś pomysły? PS, uruchamiam ten skrypt w Slow Leopard.
shopt -s nullglob
a następnie po prostu odwołaj się do*.exe *.mp3 *.mp4
. Zobacz mywiki.wooledge.org/ParsingLsOdpowiedzi:
Dlaczego nie:
Nie jestem pewien, gdzie się tego nauczyłem - ale używam tego.
źródło
ls: *.exe: No such file or directory
np:ls *.{zip,tar.gz,tar} 2>/dev/null
Używaj wyrażeń regularnych z
find
:Jeśli piszesz nazwy plików:
Chroni to nazwy plików, które zawierają spacje lub znaki nowej linii.
OS X
find
obsługuje naprzemienność tylko wtedy, gdy-E
używana jest opcja (ulepszona).źródło
find . -iregex '.*\(mp3\|mp4\|exe\)'
mysupermp3.jpg
rozważ dodanie$
na końcu wyrażenia regularnego i\\.
przed rozszerzeniamiegrep
- rozszerzona grep - pomoże tutajpowinien wykonać pracę.
źródło
ls
do terminala (lub z-C
opcją) generuje wielokolumnowe wyjście.ls
do potoku (lub z-1
) ma pojedynczą kolumnę. (Porównaj dane wyjściowe zls
zls | cat
).najłatwiej jest po prostu użyć ls
źródło
ls
nie ma cichej opcji.Na wszelki wypadek: dlaczego nie używasz
find
?źródło
find . -name '*.mkv' -o -name '*.flv'
(dodając tyle klauzul -o, ile potrzeba). Potrzebowałem.
do wskazania katalogu i flagi-name
nie-iname
- jestem na macOS 10.13.Nie ma potrzeby używania grepa. Dzikie karty powłoki załatwią sprawę.
Jeśli uciekłeś
wtedy niedopasowane globy zostaną całkowicie usunięte i nie pozostaną nierozwinięte w wierszu poleceń.
Jeśli chcesz, aby globbing nie uwzględniał wielkości liter (więc * .mp3 będzie pasować do foo.MP3):
źródło
-R
opcją wyświetlania pasujących plików w podkatalogach, ale ta opcja nie wydaje się mieć żadnego efektu i nadal otrzymuję tylko wyniki bieżącego katalogu.Jeśli nadal szukasz alternatywnego rozwiązania:
W razie potrzeby możesz dodać więcej flag -e.
źródło
Dla użytkowników OSX :
Jeśli użyjesz
ls *.{mp3,exe,mp4}
, wyświetli błąd, jeśli jedno z tych rozszerzeń nie da żadnych wyników.Użycie
ls *.(mp3|exe|mp4)
zwróci wszystkie pliki pasujące do tych rozszerzeń, nawet jeśli jedno z rozszerzeń dało 0 wyników .źródło
ls *.@(mp3|exe|mp4)
. Potrzebujesz,shopt -s extglob
żeby to zadziałało. Nawiasem mówiąc,ls
jest też bezużyteczny, możesz po prostu zrobićprintf '%s\n' *.@(mp3|exe|mp4)
.źródło
mdfind
najlepsze / najszybsze wyszukiwania!mdfind -name querystring | grep "\.h$"
znajduje wszystkie nagłówki z quesrystring w tytule pliku. pronto.ls -R | findstr ".mp3"
ls -R
=> rekurencyjnie wyświetla podkatalogiźródło
Oto jeden przykład, który zadziałał dla mnie.
źródło