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 fraa * (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
ogimage.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
matcherjpg
såvel somJPG 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.
find -name
mønster, der matcher flere mønstre ved SÅfind . | egrep '.jpg|.png'
meget.