Jeg kan få alle jpg billeder ved hjælp af:

find . -name "*.jpg" 

Men hvordan kan jeg tilføje png filer til resultaterne også?

Kommentarer

Svar

Brug -o flag mellem forskellige parametre.

find ./ -type f \( -iname \*.jpg -o -iname \*.png \) fungerer som en charme.

BEMÆRK Der skal være et mellemrum mellem beslaget og dets indhold eller det fungerer ikke.

Forklaring:

  • -type f – søg kun efter filer (ikke mapper)
  • \( & \) – er nødvendige for at -type f skal gælde for alle argumenter
  • -o – logisk ELLER operatør
  • -iname – ligesom -name, men matchet er ikke stort mellem store og små bogstaver

Kommentarer

  • Har du brug for parenteser? Kommandoen fungerer for mig uden dem. Er de nødvendige til nogle skaller?
  • @miked Kommandoen " fungerer " uden dem, ja, men du ' vinder op med at få hits på mapper, der ender i .png samt filer, der slutter med .jpg, hvilket ikke er nøjagtigt, hvad det var meningen.
  • Tak for afklaring! type -f udvides ikke og gælder ikke for begge udtryk uden parenteser, så find ./ -type f -iname \*.jpg -o -type f -iname \*.png fungerer også … selvom det ' er to tegn længere 🙂
  • Det ' er et spørgsmål om operatørens forrang. Ligesom a * b + c er forskellig fra a * (b + c)
  • @jdhao God fangst, ændret.

Svar

Du kan kombinere kriterier med -o som foreslået af Shadur . Bemærk, at -o har lavere forrang end sidestilling, så du har muligvis brug for 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 brug -regex til at kombinere udvidelser på en terser måde. Standard regexp-syntaksen er Emacs ( grundlæggende regexps plus et par udvidelser såsom \| til alternering); der er mulighed for at skifte til udvidede regexps .

find -regex ".*\.\(jpg\|png\)" find -regextype posix-extended -regex ".*\.(jpg|png)" 

På FreeBSD, NetBSD og OSX kan du bruge -regex kombineret med -E til udvidede regexps.

find -E . -regex ".*\.(jpg|png)" 

Kommentarer

  • Det ' er altid bedre at bruge -iname i stedet for -name – så fanger du også image.JPG og image.PnG

Svar

Dette er mere korrekt:

find . -iregex ".*\.\(jpg\|gif\|png\|jpeg\)$" 

Kommentarer

  • Hvorfor siger du, at det er " mere " korrekt?
  • @Kevin antager jeg, fordi -iregex matcher jpg såvel som JPG Jpg jpG og sådan. Jeg tror, at $ ikke er ' t nødvendigt .
  • Dette fungerer fint på MinGW .
  • Først udeladte du søgemappen som det første argument, som vil kaste en fejl. For det andet fungerer det ikke ved at undslippe parentes ved OSX, og dette skal bruges i stedet: find -E . -iregex '.*\.(jpg|png|gif)' som vist i @sorin ' s svar.

Svar

For at gøre det klart er den eneste mulighed, der fungerer på Linux, Unix og macOS-smag:

find -E . -regex ".*\.(jpg|png)" 

Det skyldes, at OS X-versionen er lidt anderledes, men det er vigtigt at skrive ting, der går godt på de fleste platforme.

Kommentarer

  • -E-flag er ikke gyldigt til søgning på Ubuntu 14.04
  • Flagget -E er ikke gyldigt på MinGW enten (i det mindste den version / konfiguration, jeg prøvede den på (standardkonfiguration for en bestemt version)).
  • Hvilken del af -type f \( -iname \*.png -o -iname \*.jpg\) fungerer ikke på OSX?
  • Kan bekræfte -type f \( -iname \*.png -o -iname \*.jpg\) fungerer på OSX

Svar

/\.(jpe?g|png|gif|bmp)$/i; 

Brug det.

Kommentar s

  • Du skal muligvis forklare dette lidt.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *