it-swarm.com.de

Verwendung des Befehls find zum Suchen nach mehreren Erweiterungen

Ich kann alle jpg Bilder erhalten, indem ich:

find . -name "*.jpg"  

Aber wie kann ich den Ergebnissen auch png -Dateien hinzufügen?

143
wong2

Verwenden Sie das Flag -o Zwischen verschiedenen Parametern.

find ./ -type f \( -iname \*.jpg -o -iname \*.png \) funktioniert wie ein Zauber.

NOTE Es muss ein Leerzeichen zwischen der Klammer und ihrem Inhalt sein, sonst hat es gewonnen funktioniert nicht.

Erläuterung:

  • -type f - Nur nach Dateien suchen (keine Verzeichnisse)
  • \( & \) - werden benötigt, damit -type f Auf alle Argumente angewendet werden kann
  • -o - logischer OR Operator
  • -iname - wie -name, Aber bei der Übereinstimmung wird die Groß- und Kleinschreibung nicht berücksichtigt
176
Shadur

Sie können Kriterien mit -o Als vorgeschlagen von Shadur kombinieren. Beachten Sie, dass -o Eine niedrigere Priorität als das Nebeneinander hat, sodass Sie möglicherweise Klammern benötigen.

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 -regex Verwenden, um Erweiterungen auf engere Weise zu kombinieren. Die Standard-Regexp-Syntax lautet Emacs ( grundlegende Regexps plus einige Erweiterungen wie \| Für den Wechsel); Es gibt eine Option zum Wechseln zu erweiterte reguläre Ausdrücke .

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

Unter FreeBSD, NetBSD und OSX können Sie -regex In Kombination mit -E Für erweiterte reguläre Ausdrücke verwenden.

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

Das ist richtiger:

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

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

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

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

9
sorin