Pot obține toate imaginile jpg
folosind:
find . -name "*.jpg"
Dar cum pot adăuga fișiere png
și la rezultate?
Comentarii
Răspunde
Utilizați steagul -o
între diferiți parametri.
find ./ -type f \( -iname \*.jpg -o -iname \*.png \)
funcționează ca un farmec.
NOTĂ trebuie să existe un spațiu între paranteză și conținutul său sau nu a funcționat.
Explicație:
-
-type f
– căutați numai fișiere (nu directoare) -
\(
&\)
– sunt necesare pentru ca-type f
să se aplice tuturor argumentelor -
-o
– SAU logic operator -
-iname
– ca-name
, dar potrivirea nu face sensibilitate la majuscule și minuscule
Comentarii
- Aveți nevoie de paranteze. Comanda funcționează pentru mine fără ele. Sunt necesare pentru niște cochilii?
- @miked Comanda va " funcționa " fără ele, da, dar ' ați terminat obținând accesări pe directoare care se termină în .png, precum și pe fișiere care se termină cu .jpg, care nu este exact ceea ce a fost intenționat.
- Mulțumesc pentru clarificare!
type -f
nu se extinde și nu se aplică ambelor expresii fără paranteze, deci funcționează șifind ./ -type f -iname \*.jpg -o -type f -iname \*.png
… deși are două caractere mai lungi 🙂 - Este ' o chestiune de prioritate a operatorului. La fel cum
a * b + c
este diferit dea * (b + c)
- @jdhao Captură bună, modificată.
Răspuns
Puteți combina criteriile cu -o
ca sugerat de Shadur . Rețineți că -o
are o prioritate mai mică decât juxtapunerea, deci este posibil să aveți nevoie de paranteze.
find . -name "*.jpg" -o -name "*.png" find . -mtime -7 \( "*.jpg" -o -name "*.png" \) # all .jpg or .png images modified in the past week
Pe Linux, puteți utilizați -regex
pentru a combina extensiile într-un mod terser. Sintaxa implicită pentru regexp este Emacs ( regexps de bază plus câteva extensii precum \|
pentru alternanță); există o opțiune pentru a comuta la regexps extins .
find -regex ".*\.\(jpg\|png\)" find -regextype posix-extended -regex ".*\.(jpg|png)"
Pe FreeBSD, NetBSD și OSX, puteți utiliza -regex
combinat cu -E
pentru regexps extinse.
find -E . -regex ".*\.(jpg|png)"
Comentarii
- Este ' întotdeauna mai bine să folosiți
-iname
în loc de-name
– atunci veți captura șiimage.JPG
șiimage.PnG
Răspuns
Acest lucru este mai corect:
find . -iregex ".*\.\(jpg\|gif\|png\|jpeg\)$"
Comentarii
- De ce spuneți că este " mai mult " corect?
- @Kevin cred că pentru că
-iregex
se potrivește cujpg
, precum și cuJPG Jpg jpG
și altele. Cred că$
nu este necesar ' . - Acest lucru funcționează bine pe MinGW .
- Mai întâi, ați omis folderul de căutare ca prim argument care va arunca o eroare. În al doilea rând, pe OSX, scăparea parantezei nu va funcționa, iar aceasta ar trebui folosită în schimb:
find -E . -iregex '.*\.(jpg|png|gif)'
așa cum se arată în răspunsul @sorin '.
Răspuns
Pentru a clarifica, singura opțiune care funcționează pe Linux, Unix și aroma MacOS este:
find -E . -regex ".*\.(jpg|png)"
Asta deoarece versiunea OS X este puțin diferită, dar este important pentru a scrie lucruri care merg bine pe majoritatea platformelor.
Comentarii
- Steagul -E nu este valid pentru găsirea pe Ubuntu 14.04
- Steagul -E nu este valid pe MinGW fie (cel puțin versiunea / configurația pe care am încercat-o (configurație implicită pentru o anumită versiune)).
- Ce parte din
-type f \( -iname \*.png -o -iname \*.jpg\)
nu funcționează pe OSX? - Poate confirma că
-type f \( -iname \*.png -o -iname \*.jpg\)
funcționează pe OSX
Răspuns
/\.(jpe?g|png|gif|bmp)$/i;
Folosește-l.
Comentariu s
- Poate că va trebui să explicați puțin acest lucru.
find -name
model care se potrivește cu mai multe tipare la AȘAfind . | egrep '.jpg|.png'
foarte mult.