Verwendung des Befehls find zum Suchen nach mehreren Erweiterungen


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

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)'

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\)$'

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.


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.


5
Möglicherweise müssen Sie dies ein wenig erläutern.
Chaos
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.