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ån a * (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ånga image.JPG och image.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 matchar jpg samt JPG 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.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *