Ik wil gewoon de bestanden van de huidige dir en alleen uitvoeren .MP4 .mp3 .exe-bestanden niets anders.
Dus ik dacht dat ik dit gewoon kon doen:
ls | grep \.mp4$ | grep \.mp3$ | grep \.exe$
Maar NEE, zoals de eerste grep uitvoert, wordt de andere 2 grep’s daarmee niet gebruikt.
alle ideeën? PS, het uitvoeren van dit script op langzaam luipaard.
1, Autoriteit 100%
Waarom niet:
ls *.{mp3,exe,mp4}
Ik weet niet zeker waar ik het heb geleerd – maar ik heb dit gebruikt.
2, Autoriteit 13%
egrep
– Extended grep – helpt hier
ls | egrep '\.mp4$|\.mp3$|\.exe$'
zou de taak moeten doen.
3, Autoriteit 11%
Gebruik reguliere uitdrukkingen met find
:
find . -iregex '.*\.\(mp3\|mp4\|exe\)' -printf '%f\n'
Als u de bestandsnamen pakt:
find . -iregex '.*\.\(mp3\|mp4\|exe\)' -printf '%f\0' | xargs -0 dosomething
Dit beschermt bestandsnamen die spaties of newlines bevatten.
OS X find
ondersteunt alleen afwisseling wanneer de optie -E
(verbeterde) wordt gebruikt.
find -E . -regex '.*\.(mp3|mp4|exe)'
4, Autoriteit 4%
De eenvoudigste manier is om alleen ls
te gebruiken
ls *.mp4 *.mp3 *.exe
5, Autoriteit 3%
Voor het geval dat: Waarom gebruikt u find
?
find -iname '*.mp3' -o -iname '*.exe' -o -iname '*.mp4'
6, Autoriteit 2%
Geen behoefte aan grep. Shell-jokertekens zullen de truc doen.
ls *.mp4 *.mp3 *.exe
Als u
hebt uitgevoerd
shopt -s nullglob
Dan worden ongeëvenaarde globs helemaal verwijderd en niet op de opdrachtregel blijven.
Als u case-ongevoelige globbing wilt (dus * .mp3 komt overeen met foo.mp3):
shopt -s nocaseglob
7
Als u nog steeds op zoek bent naar een alternatieve oplossing:
ls | grep -i -e '\\.tcl$' -e '\\.exe$' -e '\\.mp4$'
Voel je vrij om meer vlaggen toe te voegen indien nodig.
8
ls | grep "\.mp4$
\.mp3$
\.exe$"
9
ls -R | findstr ".mp3"
ls -R
= & GT; somt subdirectories op
10
Het is eenvoudig om deze opdracht te gebruiken:
ls | grep \.txt$ && ls | grep \.exe
11
Hier is een voorbeeld dat voor mij heeft gewerkt.
find <mainfolder path> -name '*myfiles.java' | xargs -n 1 basename