Ich kann alle jpg
Bilder abrufen, indem ich Folgendes verwende:
find . -name "*.jpg"
Aber wie kann ich den Ergebnissen auch png
-Dateien hinzufügen?
Kommentare
- Verwandte Themen:
find -name
Muster, das mehreren Mustern entspricht at SO - Ich grabe
find . | egrep '.jpg|.png'
viel.
Antwort
Verwenden Sie das Flag -o
zwischen verschiedenen Parametern.
find ./ -type f \( -iname \*.jpg -o -iname \*.png \)
funktioniert wie ein Zauber.
HINWEIS Zwischen der Klammer und ihrem Inhalt muss ein Leerzeichen stehen es wird nicht funktionieren.
Erläuterung:
-
-type f
– nur nach Dateien suchen (keine Verzeichnisse) -
\(
&\)
– werden benötigt, damit das-type f
auf alle Argumente angewendet wird. -
-o
– logisches ODER Operator -
-iname
– wie-name
, aber die Übereinstimmung unterscheidet nicht zwischen Groß- und Kleinschreibung
Kommentare
- Benötigen Sie die Klammern? Der Befehl funktioniert für mich ohne sie. Werden sie für einige Shells benötigt?
- @miked Der Befehl " funktioniert " ohne sie, ja, aber Sie ' erhalten Treffer in Verzeichnissen, die mit .png enden, sowie in Dateien, die mit .jpg enden, was nicht genau beabsichtigt ist.
- Danke fürs klarstellen! Die
type -f
wird nicht erweitert und gilt nicht für beide Ausdrücke ohne die Klammern.find ./ -type f -iname \*.jpg -o -type f -iname \*.png
funktioniert also auch … obwohl es ' ist zwei Zeichen länger 🙂 - Es ' ist eine Frage der Priorität des Operators. Genau wie
a * b + c
sich vona * (b + c)
- @jdhao unterscheidet. Guter Fang, geändert.
Antwort
Sie können Kriterien mit -o
als vorgeschlagen von Shadur . 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 dies Verwenden Sie -regex
, um Erweiterungen auf engere Weise zu kombinieren. Die Standard-Regexp-Syntax lautet Emacs ( grundlegende Regexps sowie einige Erweiterungen wie \|
zur Abwechslung). Es gibt eine Option zum Wechseln zu erweiterten regulären Ausdrücken .
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)"
Kommentare
- ' ist immer besser,
-iname
statt-name
– dann erfassen Sie auchimage.JPG
undimage.PnG
Antwort
Dies ist korrekter:
find . -iregex ".*\.\(jpg\|gif\|png\|jpeg\)$"
Kommentare
- Warum ist " mehr " korrekt?
- @ Kevin Ich denke, weil
-iregex
mitjpg
sowieJPG Jpg jpG
und so. Ich denke, die$
wird nicht ' benötigt . - Dies funktioniert gut bei MinGW .
- Zuerst haben Sie den Suchordner als erstes Argument weggelassen, das ausgelöst wird ein Fehler. Zweitens funktioniert das Entkommen der Klammer unter OSX nicht, und dies sollte stattdessen verwendet werden:
find -E . -iregex '.*\.(jpg|png|gif)'
wie in der Antwort von @sorin ' gezeigt.
Antwort
Um es klar zu machen, ist die einzige Option, die unter Linux, Unix und MacOS funktioniert:
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.
Kommentare
- -E-Flag ist für die Suche unter Ubuntu 14.04 nicht gültig.
- Das -E-Flag ist für MinGW (zumindest die Version / Konfiguration, an der ich es ausprobiert habe (Standardkonfiguration für eine bestimmte Version)).
- Welcher Teil von
-type f \( -iname \*.png -o -iname \*.jpg\)
funktioniert unter OSX nicht? - Kann bestätigen, dass
-type f \( -iname \*.png -o -iname \*.jpg\)
unter OSX
Antwort
/\.(jpe?g|png|gif|bmp)$/i;
Verwenden Sie es.
Kommentar s
- Möglicherweise müssen Sie dies ein wenig erklären.