Vreau doar pentru a obține fișierele din directorul curent și ieșire .mp4 .mp3 .exe, fișiere de nimic altceva. Așa că am crezut că am putea face acest lucru:
ls | grep \.mp4$ | grep \.mp3$ | grep \.exe$
Dar nu, ca prima grep va afișa doar mp4's pentru acestea alte 2 grep's câștigat't fi utilizate.
Orice idei? PS, care Rulează acest script pe Lent Leopard.
Utilizați expresii regulate cu "găsi":
find . -iregex '.*\.\(mp3\|mp4\|exe\)' -printf '%f\n'
Daca're conducte de nume de fișiere:
find . -iregex '.*\.\(mp3\|mp4\|exe\)' -printf '%f\0' | xargs -0 dosomething
Aceasta protejează nume de fișiere care conțin spații sau linii noi.
OS X "găsi" acceptă numai alternanța când -E
(enhanced) opțiune este utilizată.
find -E . -regex '.*\.(mp3|mp4|exe)'
Nu este nevoie de grep. Shell metacaractere va face truc.
ls *.mp4 *.mp3 *.exe
Dacă ați rulat
shopt -s nullglob
apoi neegalat globuri vor fi eliminate cu totul și să nu fie lăsat în linia de comandă neexpandate.
Dacă doriți caz-insensibil expandarea (așa *.mp3 va potrivi foo.MP3):
shopt -s nocaseglob
Pentru utilizatorii OSX:
Dacă utilizați e *.{mp3,exe,mp4}
, se va arunca o eroare dacă una dintre aceste extensii nu are rezultate.
Folosind e *.(mp3|exe|mp4)
va returna toate fișierele care se potrivesc cu aceste extensii, chiar dacă una dintre extensiile avut 0 rezultate.
În cazul în care sunteți încă în căutarea pentru o soluție alternativă:
ls | grep -i -e '\\.tcl$' -e '\\.exe$' -e '\\.mp4$'
Simțiți-vă liber pentru a adăuga mai mult-e steaguri, dacă este necesar.
ls-R | findstr exe ".mp3"
ls-R
=> liste de subdirectoare recursiv