Posso ottenere tutte le jpg
immagini utilizzando:
find . -name "*.jpg"
Ma come posso aggiungere anche i file png
ai risultati?
Commenti
Risposta
Utilizza il flag -o
tra diversi parametri.
find ./ -type f \( -iname \*.jpg -o -iname \*.png \)
funziona come un incantesimo.
NOTA deve uno spazio tra la parentesi e il suo contenuto oppure non funzionerà.
Spiegazione:
-
-type f
– cerca solo file (non directory) -
\(
&\)
– sono necessari per-type f
da applicare a tutti gli argomenti -
-o
– OR logico operatore -
-iname
– come-name
, ma la corrispondenza non fa distinzione tra maiuscole e minuscole
Commenti
- Hai bisogno delle parentesi. Il comando funziona per me senza di loro. Sono necessari per alcune shell?
- @miked Il comando " funzionerà " senza di loro, sì, ma ' finisci per ricevere hit su directory che terminano con .png e file che terminano con .jpg, che non è esattamente ciò che era previsto.
- Grazie per il chiarimento!
type -f
non si estende e si applica a entrambe le espressioni senza parentesi, quindi anchefind ./ -type f -iname \*.jpg -o -type f -iname \*.png
funziona … sebbene ' è più lungo di due caratteri 🙂 - ' è una questione di precedenza degli operatori. Proprio come
a * b + c
è diverso daa * (b + c)
- @jdhao Buona cattura, modificata.
Risposta
Puoi combinare criteri con -o
come suggerito da Shadur . Tieni presente che -o
ha una precedenza inferiore rispetto alla giustapposizione, quindi potresti aver bisogno delle parentesi.
find . -name "*.jpg" -o -name "*.png" find . -mtime -7 \( "*.jpg" -o -name "*.png" \) # all .jpg or .png images modified in the past week
Su Linux puoi utilizza -regex
per combinare le estensioni in modo più conciso. La sintassi regexp predefinita è Emacs ( espressioni regolari di base più alcune estensioni come \|
per lalternanza); cè unopzione per passare a espressioni regolari estese .
find -regex ".*\.\(jpg\|png\)" find -regextype posix-extended -regex ".*\.(jpg|png)"
Su FreeBSD, NetBSD e OSX, puoi utilizzare -regex
combinato con -E
per espressioni regolari estese.
find -E . -regex ".*\.(jpg|png)"
Commenti
- È ' sempre meglio utilizzare
-iname
invece di-name
, acquisirai ancheimage.JPG
eimage.PnG
Risposta
Questo è più corretto:
find . -iregex ".*\.\(jpg\|gif\|png\|jpeg\)$"
Commenti
- Perché dici che è " più " corretto?
- @Kevin immagino perché
-iregex
corrisponde ajpg
e aJPG Jpg jpG
e simili. Penso che$
non sia ' necessario . - Funziona bene su MinGW .
- Innanzitutto, hai omesso la cartella di ricerca come primo argomento che genererà un errore. In secondo luogo, su OSX lescape delle parentesi non funzionerà e dovrebbe essere usato al suo posto:
find -E . -iregex '.*\.(jpg|png|gif)'
come mostrato nella risposta di @sorin '.
Risposta
Per chiarire, lunica opzione che funziona su Linux, Unix e macOS è:
find -E . -regex ".*\.(jpg|png)"
Questo perché la versione di OS X è leggermente diversa, ma è importante scrivere cose che vadano bene sulla maggior parte delle piattaforme.
Commenti
- Il flag -E non è valido per la ricerca su Ubuntu 14.04
- Il flag -E non è valido su MinGW (almeno la versione / configurazione su cui lho provato (configurazione predefinita per una particolare versione)).
- Quale parte di
-type f \( -iname \*.png -o -iname \*.jpg\)
non funziona su OSX? - Posso confermare che
-type f \( -iname \*.png -o -iname \*.jpg\)
funziona su OSX
Risposta
/\.(jpe?g|png|gif|bmp)$/i;
Usalo.
Commenta s
- Potrebbe essere necessario spiegarlo un po .
find -name
pattern che corrisponde a più pattern su COSÌfind . | egrep '.jpg|.png'
molto.