Verwendung des Befehls find zum Suchen nach mehreren Erweiterungen

126

Ich kann alle jpgBilder erhalten, indem ich benutze:

find . -name "*.jpg"  

Aber wie kann ich auch pngDateien zu den Ergebnissen hinzufügen ?

wong2
quelle
In Verbindung find -name
stehend

Antworten:

153

Verwenden Sie das -oFlag zwischen verschiedenen Parametern.

find ./ -type f \( -iname \*.jpg -o -iname \*.png \) klappt wunderbar.

HINWEIS Es muss ein Raum zwischen der Halterung und dessen Inhalt oder es wird nicht funktionieren.

Erläuterung:

  • type -f - nur nach Dateien suchen (nicht nach Verzeichnissen)
  • \(- Wird benötigt type -f, damit alle Argumente berücksichtigt werden
  • -o - logischer ODER-Operator
  • -iname- wie -name, aber die Groß- und Kleinschreibung spielt keine Rolle
Shadur
quelle
Benötigen Sie die Klammern? Der Befehl funktioniert für mich ohne sie. Werden sie für einige Muscheln benötigt?
MikeD
2
@miked Der Befehl wird "funktionieren" ohne sie, ja, aber Sie würden Treffer auf Verzeichnisse bekommen, die mit .png enden, sowie auf Dateien, die mit .jpg enden, was nicht genau das ist, was beabsichtigt war.
Shadur
1
Danke fürs klarstellen! Das type -fnicht erweitern und gelten für beide Ausdrücke ohne die Klammern, also find ./ -type f -iname \*.jpg -o -type f -iname \*.pngfunktioniert auch ... obwohl es zwei Zeichen länger ist :-)
MikeD
2
Es ist eine Frage des Vorrangs des Bedieners. Genau wie a * b + cist anders alsa * (b + c)
Shadur
2
@ jdhao Guter Fang, geändert.
Shadur
86

Sie können Kriterien kombinieren mit -owie von Shadur vorgeschlagen . Beachten Sie, dass dies -oeine niedrigere Priorität hat als die Gegenüberstellung, sodass möglicherweise Klammern erforderlich sind.

find . -name '*.jpg' -o -name '*.png'
find . -mtime -7 \( '*.jpg' -o -name '*.png' \)  # all .jpg or .png images modified in the past week

Unter Linux können Sie -regexErweiterungen enger zusammenfassen. Die Standard-Syntax für reguläre Ausdrücke ist Emacs ( einfache reguläre Ausdrücke plus einige Erweiterungen, z. B. \|für die Abwechslung). Es gibt eine Option, um zu erweiterten regulären Ausdrücken zu wechseln .

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

Unter FreeBSD, NetBSD und OSX können Sie -regexkombiniert mit -Efür erweiterte reguläre Ausdrücke verwenden.

find -E . -regex '.*\.(jpg|png)'
Gilles
quelle
Es ist immer besser zu verwenden, -inameanstatt -name- dann werden Sie auch erfassen image.JPGundimage.PnG
ccpizza
40

Das ist richtiger:

find . -iregex '.*\.\(jpg\|gif\|png\|jpeg\)$'
Dimitry
quelle
10
Warum sagst du, dass es "mehr" richtig ist?
Kevin
2
@ Kevin Ich denke da -iregexpasst jpgauch so JPG Jpg jpGund so. Ich denke das $wird nicht benötigt.
ott--
Dies funktioniert gut auf MinGW .
Peter Mortensen,
2
Zuerst haben Sie den Suchordner als erstes Argument weggelassen, das einen Fehler auslöst. Zweitens funktioniert die Klammer unter OSX nicht und sollte stattdessen verwendet werden: find -E . -iregex '.*\.(jpg|png|gif)'wie in der Antwort von @ sorin gezeigt.
ccpizza
8

Die einzige Option, die unter Linux, Unix und MacOS funktioniert, ist:

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

Das liegt daran, dass die OS X-Version ein bisschen anders ist, aber das ist wichtig, um Dinge zu schreiben, die auf den meisten Plattformen gut funktionieren.

Sorin
quelle
2
-E Flagge ist nicht gültig für die Suche auf Ubuntu 14.04
Gogaman
Das Flag -E ist auch unter MinGW nicht gültig (mindestens die Version / Konfiguration, die ich ausprobiert habe (Standardkonfiguration für eine bestimmte Version)).
Peter Mortensen
Welcher Teil von -type f \( -iname \*.png -o -iname \*.jpg\)funktioniert nicht unter OSX?
Shadur
-3
/\.(jpe?g|png|gif|bmp)$/i;

Benutze es.

Rohit Gour
quelle
5
Möglicherweise müssen Sie dies ein wenig erläutern.
Chaos