Come usare il comando find per trovare tutti i file con estensioni dall'elenco?


179

Devo trovare tutti i file di immagine dalla directory (gif, png, jpg, jpeg).

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

Come modificare questa stringa per trovare non solo file .jpg?

Risposte:


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

6
Non funziona per me su Mac, ma funziona con l'opzione -E (estesa) (forse la pipe è una funzionalità estesa?): Trova -E / path / to -iregex ". * \. (Jpg | gif | png | jpeg) "> log
ling

138
find /path/to/  \( -iname '*.gif' -o -iname '*.jpg' \) -print0

funzionerà. Potrebbe esserci un modo più elegante.


16
-iname non farebbe distinzione tra maiuscole e minuscole
Chris Koston,

1
@Gerald: È probabile che tu debba raggruppare la tua espressione OR in parentesi sfuggite: find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -exec ls -l {} \;altrimenti il ​​exec si applica solo all'ultima parte ( -iname '*.jpg' in questo caso).
In pausa fino a nuovo avviso.

Questa è un'osservazione importante. find /path/to/ -iname '*.gif' -o -iname '*.jpg' -print0stamperà solo i file jpg! Le parentesi sono necessarie qui:find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -print0
Anne van Rossum,

28

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

La -Esi evita di dover sfuggire alle parentesi e tubi nella vostra regex.


2
la mia scoperta non ha questo -E
wieczorek1990

1
Hmmm l' -Eopzione dice finddi usare "espressioni regolari estese". Diversi altri strumenti hanno un'opzione simile, ma non sono sicuro che questa opzione sia disponibile su tutte le distribuzioni UNIX.
tboyce12,

8
Funziona anche su Mac OS.
c.gutierrez,

2
@ tboyce12 lavoro su Ubuntu, posso specificare il -regextype per semplificare l'espressione regex: find . -regextype posix-extended -regex ".*\.(jpg|gif|png|jpeg)".
doub1ejack,

1
@cjm Forse find -E /path/to -iregex ".*\.(jpg|gif|png|jpeg)" > log. L'uso della -iregexbandiera indica finddi abbinare il caso in modo insensibile.
tboyce12,

11
find /path/to/ -type f -print0 | xargs -0 file | grep -i image

Questo utilizza il filecomando per provare a riconoscere il tipo di file, indipendentemente dal nome file (o estensione).

Se /path/too un nome file contiene la stringa image, quanto sopra potrebbe restituire hit fasulli. In tal caso, suggerirei

cd /path/to
find . -type f -print0 | xargs -0 file --mime-type | grep -i image/

Siamo spiacenti, ho fatto un clic errato lì e apparentemente non riesco a annullare il downvote ... :(
Mark Simpson,

6
find /path -type f \( -iname "*.jpg" -o -name "*.jpeg" -o -iname "*gif" \)

2
Potresti spiegare perché hai aggiunto le parentesi (con escape) attorno ai parametri name / iname?
Bart Kleijngeld,

Qualche motivo per l'incoerenza? -iname *.jpg, -o -name *.jpeg, -o -iname *gifTutti hanno un formato leggermente diverso.
Carrello abbandonato

se almeno potessi spiegare le differenze con altre risposte.
el-teedee,

6

In aggiunta alla precedente risposta di @Dennis Williamson, se si desidera che lo stesso regex non faccia distinzione tra maiuscole e minuscole rispetto alle estensioni dei file, utilizzare -iregex:

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

5

Su Mac OS utilizzare

find -E packages  -regex ".*\.(jpg|gif|png|jpeg)"


-1

nel caso in cui i file non abbiano estensione possiamo cercare il tipo mime di file

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

dove (audio | video | matroska | mpeg) sono tipi mime regex

e se vuoi eliminarli:

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

o elimina tutto il resto tranne quelle estensioni:

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

nota il! ~ invece di ~

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.