Come utilizzare il comando find per cercare più estensioni


Risposte:


153

Usa il -oflag tra diversi parametri.

find ./ -type f \( -iname \*.jpg -o -iname \*.png \) funziona come un fascino.

NOTA Ci deve essere uno spazio tra la staffa e il suo contenuto o non funzionerà.

Spiegazione:

  • type -f - cerca solo file (non directory)
  • \(- necessario per l' type -fapplicazione a tutti gli argomenti
  • -o - operatore logico OR
  • -iname- Mi piace -name, ma la corrispondenza non distingue tra maiuscole e minuscole

Hai bisogno delle parentesi. Il comando funziona per me senza di loro. Sono necessari per alcune conchiglie?
MikeD

2
@miked Il comando "funzionerà" senza di loro, sì, ma finiresti per ottenere hit su directory che finiscono in .png e file che finiscono con .jpg, che non è esattamente quello che intendevi.
Shadur,

1
Grazie per il chiarimento! Il type -fnon si estende e si applica ad entrambe le espressioni senza le parentesi, quindi find ./ -type f -iname \*.jpg -o -type f -iname \*.pngfunziona anche ... anche se è più lungo di due caratteri :-)
MikeD

2
È una questione di precedenza dell'operatore. Proprio come a * b + cè diverso daa * (b + c)
Shadur

2
@jdhao Buona cattura, modificata.
Shadur,

86

Puoi combinare i criteri con -oquelli suggeriti da Shadur . Nota che -oha una precedenza inferiore rispetto alla giustapposizione, quindi potresti aver bisogno di 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 usare -regexper combinare le estensioni in un modo più terser. La sintassi regexp predefinita è Emacs ( regexps di base più alcune estensioni come \|per l'alternanza); c'è un'opzione per passare a regexps estesi .

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

Su FreeBSD, NetBSD e OSX, puoi usare -regexcombinato con -Eregexps estesi.

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

È sempre meglio usare -inameinvece di -name- quindi anche catturare image.JPGeimage.PnG
ccpizza l'

40

Questo è più corretto:

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

10
Perché dici che è "più" corretto?
Kevin,

2
@Kevin Immagino perché -iregexpartite jpgcosì come JPG Jpg jpGe simili. Penso che $non sia necessario.
ott--

Funziona bene su MinGW .
Peter Mortensen,

2
Innanzitutto, hai omesso la cartella di ricerca come primo argomento che genererà un errore. In secondo luogo, su OSX la fuga tra parentesi non funzionerà, e questo dovrebbe essere usato invece: find -E . -iregex '.*\.(jpg|png|gif)'come mostrato nella risposta di @ sorin.
ccpizza,

8

Per chiarire, l'unica 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.


2
-E flag non è valido per essere trovato su Ubuntu 14.04
gogaman

Il flag -E non è valido nemmeno su MinGW (almeno la versione / configurazione su cui l'ho provato (configurazione predefinita per una versione particolare)).
Peter Mortensen,

Quale parte di -type f \( -iname \*.png -o -iname \*.jpg\)non funziona su OSX?
Shadur,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.