Wie finde ich mit dem Befehl find alle Dateien mit Erweiterungen aus der Liste?

179

Ich muss alle Bilddateien aus dem Verzeichnis finden (gif, png, jpg, jpeg).

find /path/to/ -name "*.jpg" > log

Wie ändere ich diese Zeichenfolge, um nicht nur JPG-Dateien zu finden?

Kirzilla
quelle

Antworten:

189
find /path/to -regex ".*\.\(jpg\|gif\|png\|jpeg\)" > log
Bis auf weiteres angehalten.
quelle
6
Funktioniert bei Mac nicht, funktioniert aber mit der Option -E (erweitert) (möglicherweise ist die Pipe eine erweiterte Funktion?): Find -E / path / to -iregex ". * \. (Jpg | gif | png | jpeg)“> log
ling
138
find /path/to/  \( -iname '*.gif' -o -iname '*.jpg' \) -print0

wird funktionieren. Es könnte einen eleganteren Weg geben.

JoseK
quelle
16
-iname würde Groß- und Kleinschreibung nicht berücksichtigen
Chris Koston
1
@Gerald: Es ist wahrscheinlich, dass Sie Ihren ODER-Ausdruck in Klammern gruppieren müssen. find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -exec ls -l {} \;Andernfalls gilt die Ausführung nur für den letzten Teil ( -iname '*.jpg' in diesem Fall).
Bis auf weiteres angehalten.
Das ist eine wichtige Bemerkung. find /path/to/ -iname '*.gif' -o -iname '*.jpg' -print0druckt nur die JPG-Dateien! Sie benötigen hier Klammern:find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -print0
Anne van Rossum
28

find -E /path/to -regex ".*\.(jpg|gif|png|jpeg)" > log

Das -Eerspart Ihnen die Flucht vor den Parens und Pfeifen in Ihrer Regex.

tboyce12
quelle
2
Mein Fund hat dieses -E
wieczorek1990
1
Hmmm, die -EOption weist findan, "erweiterte reguläre Ausdrücke" zu verwenden. Einige andere Tools haben eine ähnliche Option, aber ich bin nicht sicher, ob diese Option auf allen UNIX-Distributionen verfügbar ist.
tboyce12
8
Funktioniert auch unter Mac OS.
c.gutierrez
2
@ tboyce12 Unter Ubuntu kann ich den -regextype angeben, um den Regex-Ausdruck zu vereinfachen : find . -regextype posix-extended -regex ".*\.(jpg|gif|png|jpeg)".
Doub1ejack
1
@cjm Vielleicht find -E /path/to -iregex ".*\.(jpg|gif|png|jpeg)" > log. Wenn Sie das -iregexFlag verwenden, wird finddie Groß- und Kleinschreibung nicht berücksichtigt.
tboyce12
11
find /path/to/ -type f -print0 | xargs -0 file | grep -i image

Mit diesem fileBefehl wird versucht, den Dateityp unabhängig vom Dateinamen (oder der Erweiterung) zu erkennen.

Wenn /path/tooder ein Dateiname die Zeichenfolge enthält image, kann das oben Gesagte falsche Treffer zurückgeben. In diesem Fall würde ich vorschlagen

cd /path/to
find . -type f -print0 | xargs -0 file --mime-type | grep -i image/
unutbu
quelle
Sorry, hatte einen fehlerhaften Klick dort und ich kann anscheinend die Abwertung nicht rückgängig machen ... :(
Mark Simpson
6
find /path -type f \( -iname "*.jpg" -o -name "*.jpeg" -o -iname "*gif" \)
Ghostdog74
quelle
2
Können Sie erklären, warum Sie die (maskierten) Klammern um die Parameter name / iname hinzugefügt haben?
Bart Kleijngeld
Gibt es einen Grund für die Inkonsistenz? -iname *.jpg, -o -name *.jpeg, -o -iname *gifHaben alle ein etwas anderes Format.
Verlassener Wagen
wenn Sie zumindest Unterschiede mit anderen Antworten erklären könnten.
El-Teedee
6

Als Ergänzung zu der obigen Antwort von @Dennis Williamson verwenden Sie -iregex, wenn Sie möchten, dass derselbe reguläre Ausdruck bei Groß- und Kleinschreibung für die Dateierweiterungen nicht berücksichtigt wird:

find /path/to -iregex ".*\.\(jpg\|gif\|png\|jpeg\)" > log
TCW
quelle
5

Unter Mac OS verwenden

find -E packages  -regex ".*\.(jpg|gif|png|jpeg)"
7ynk3r
quelle
3
find -regex ".*\.\(jpg\|gif\|png\|jpeg\)"
Shrikant
quelle
-1

Falls Dateien keine Erweiterung haben, können wir nach dem Dateimimetyp suchen

find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 ~ /audio|video|matroska|mpeg/) print $1 }'

Dabei (Audio | Video | Matroska | MPEG) sind MIME-Typen Regex

& wenn du sie löschen willst:

find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 ~ /audio|video|matroska|mpeg/) print $1 }' | while read f ; do
  rm "$f"
done

oder löschen Sie alles andere als diese Erweiterungen:

find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 !~ /audio|video|matroska|mpeg/) print $1 }' | while read f ; do
  rm "$f"
done

beachte das! ~ statt ~

k. Damhirschkuh
quelle