Jeg kan få alle jpg
bilder ved å bruke:
find . -name "*.jpg"
Men hvordan kan jeg legge til png
filer i resultatene også?
Kommentarer
Svar
Bruk -o
-flagget mellom forskjellige parametere.
find ./ -type f \( -iname \*.jpg -o -iname \*.png \)
fungerer som en sjarm.
MERK Det må være et mellomrom mellom braketten og innholdet eller det fungerer ikke.
Forklaring:
-
-type f
– bare søk etter filer (ikke kataloger) -
\(
&\)
– er nødvendig for at-type f
skal gjelde for alle argumenter -
-o
– logisk ELLER operatør -
-iname
– som-name
, men samsvaret er ikke mellom store og små bokstaver
Kommentarer
- Trenger du parenteser. Kommandoen fungerer for meg uten dem. Trengs de for noen skall?
- @miked Kommandoen " fungerer " uten dem, ja, men du ' slutter å få treff på kataloger som ender med .png, samt filer som slutter med .jpg, som ikke er akkurat det som var ment.
- Takk for avklaring!
type -f
utvides ikke og gjelder ikke begge uttrykkene uten parenteser. Såfind ./ -type f -iname \*.jpg -o -type f -iname \*.png
fungerer også … selv om det ' har to tegn lenger 🙂 - Det ' er et spørsmål om operatørens forrang. Akkurat som
a * b + c
er forskjellig fraa * (b + c)
- @jdhao God fangst, endret.
Svar
Du kan kombinere kriterier med -o
som foreslått av Shadur . Merk at -o
har lavere prioritet enn sidestilling, så du kan trenge parenteser.
find . -name "*.jpg" -o -name "*.png" find . -mtime -7 \( "*.jpg" -o -name "*.png" \) # all .jpg or .png images modified in the past week
På Linux kan du bruk -regex
for å kombinere utvidelser på en terser måte. Standard regexp-syntaks er Emacs ( grunnleggende regexps pluss noen få utvidelser som \|
for veksling); det er et alternativ å bytte til utvidede regexps .
find -regex ".*\.\(jpg\|png\)" find -regextype posix-extended -regex ".*\.(jpg|png)"
På FreeBSD, NetBSD og OSX, kan du bruke -regex
kombinert med -E
for utvidede regexps.
find -E . -regex ".*\.(jpg|png)"
Kommentarer
- Det ' er alltid bedre å bruke
-iname
i stedet for-name
– så vil du også fangeimage.JPG
ogimage.PnG
Svar
Dette er mer riktig:
find . -iregex ".*\.\(jpg\|gif\|png\|jpeg\)$"
Kommentarer
- Hvorfor sier du at det er " mer " riktig?
- @Kevin antar jeg at
-iregex
samsvarer medjpg
så vel somJPG Jpg jpG
og slikt. Jeg tror$
ikke er ' t nødvendig . - Dette fungerer bra på MinGW .
- Først utelatt du søkemappen som første argument som vil kaste en feil. For det andre, på OSX vil ikke unnslippe parentes fungere, og dette bør brukes i stedet:
find -E . -iregex '.*\.(jpg|png|gif)'
som vist i @sorin ' s svar.
Svar
For å gjøre det klart er det eneste alternativet som fungerer på Linux, Unix og macOS-smak:
find -E . -regex ".*\.(jpg|png)"
Det er fordi OS X-versjonen er litt annerledes, men det er viktig å skrive ting som går bra på de fleste plattformer.
Kommentarer
- -E-flagget er ikke gyldig for funn på Ubuntu 14.04
- -E-flagget er ikke gyldig på MinGW enten (i det minste versjonen / konfigurasjonen jeg prøvde den på (standardkonfigurasjon for en bestemt versjon)).
- Hvilken del av
-type f \( -iname \*.png -o -iname \*.jpg\)
fungerer ikke på OSX? - Kan bekrefte
-type f \( -iname \*.png -o -iname \*.jpg\)
fungerer på OSX
Svar
/\.(jpe?g|png|gif|bmp)$/i;
Bruk det.
Kommentar s
- Du må kanskje forklare dette litt.
find -name
mønster som samsvarer med flere mønstre på SÅfind . | egrep '.jpg|.png'
mye.