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 anche find ./ -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 da a * (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 anche image.JPG e image.PnG

Risposta

Questo è più corretto:

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

Commenti

  • Perché dici che è " più " corretto?
  • @Kevin immagino perché -iregex corrisponde a jpg e a JPG 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 .

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *