Jag kan få alla jpg
bilder med:
find . -name "*.jpg"
Men hur kan jag lägga till png
filer till resultaten också?
Kommentarer
Svar
Använd -o
-flaggan mellan olika parametrar.
find ./ -type f \( -iname \*.jpg -o -iname \*.png \)
fungerar som en charm.
OBS Det måste vara ett mellanslag mellan fästet och dess innehåll eller det fungerar inte.
Förklaring:
-
-type f
– sök bara efter filer (inte kataloger) -
\(
&\)
– behövs för att-type f
ska kunna tillämpas på alla argument -
-o
– logisk ELLER operatör -
-iname
– som-name
, men matchningen är skiftlägeskänslig
Kommentarer
- Behöver du parenteser. Kommandot fungerar för mig utan dem. Behövs de för några skal?
- @miked Kommandot " fungerar " utan dem, ja, men du ' slutar få träffar på kataloger som slutar på .png samt filer som slutar med .jpg, vilket inte är exakt vad som var tänkt.
- Tack för klargörandet!
type -f
sträcker sig inte och gäller inte båda uttrycken utan parenteserna.find ./ -type f -iname \*.jpg -o -type f -iname \*.png
fungerar också … även om det ' har två tecken längre 🙂 - Det ' är en fråga om operatörens företräde. Precis som
a * b + c
skiljer sig fråna * (b + c)
- @jdhao Bra fångst, ändrad.
Svar
Du kan kombinera kriterier med -o
som föreslagen av Shadur . Observera att -o
har lägre prioritet än sidoposition, så du kan behöva 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 använd -regex
för att kombinera tillägg på ett terser sätt. Standard regexp-syntax är Emacs ( grundläggande regexps plus några tillägg som \|
för alternering); det finns ett alternativ att växla till utökade regexps .
find -regex ".*\.\(jpg\|png\)" find -regextype posix-extended -regex ".*\.(jpg|png)"
På FreeBSD, NetBSD och OSX kan du använda -regex
i kombination med -E
för utökade regexps.
find -E . -regex ".*\.(jpg|png)"
Kommentarer
- Det ' är alltid bättre att använda
-iname
istället för-name
– då kommer du också att fångaimage.JPG
ochimage.PnG
Svar
Detta är mer korrekt:
find . -iregex ".*\.\(jpg\|gif\|png\|jpeg\)$"
Kommentarer
- Varför säger du att det är " mer " korrekt?
- @Kevin antar jag att
-iregex
matcharjpg
samtJPG Jpg jpG
och sådant. Jag tror att$
inte är ' t behövs . - Det fungerar bra på MinGW .
- Först utelämnade du sökmappen som första argument som kommer att kasta ett fel. För det andra, på OSX kommer inte parenteser att fungera, och detta bör användas istället:
find -E . -iregex '.*\.(jpg|png|gif)'
som visas i @sorin ' s svar.
Svar
För att göra det tydligt är det enda alternativet som fungerar på Linux, Unix och macOS-smak:
find -E . -regex ".*\.(jpg|png)"
Det beror på att OS X-versionen är lite annorlunda, men det är viktigt att skriva saker som går bra på de flesta plattformar.
Kommentarer
- -E-flaggan är inte giltig för sökning på Ubuntu 14.04
- Flaggan -E är inte giltig på MinGW antingen (åtminstone versionen / konfigurationen jag försökte den på (standardkonfiguration för en viss version)).
- Vilken del av
-type f \( -iname \*.png -o -iname \*.jpg\)
fungerar inte på OSX? - Kan bekräfta
-type f \( -iname \*.png -o -iname \*.jpg\)
fungerar på OSX
Svar
/\.(jpe?g|png|gif|bmp)$/i;
Använd det.
Kommentar s
- Du kan behöva förklara detta lite.
find -name
mönster som matchar flera mönster vid SÅfind . | egrep '.jpg|.png'
mycket.