Respuestas:
find /path/to -regex ".*\.\(jpg\|gif\|png\|jpeg\)" > log
find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -print0
trabajará. Puede haber una forma más elegante.
find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -exec ls -l {} \;contrario, el ejecutivo solo se aplica a la última parte ( -iname '*.jpg' en este caso).
find /path/to/ -iname '*.gif' -o -iname '*.jpg' -print0solo imprimirá los archivos jpg! Necesita paréntesis aquí:find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -print0
find -E /path/to -regex ".*\.(jpg|gif|png|jpeg)" > log
Esto le -Eahorra tener que escapar de los parens y las tuberías en su expresión regular.
-Eopción le dice findque use "expresiones regulares extendidas". Varias otras herramientas tienen una opción similar, pero no estoy seguro de que esta opción esté disponible en todas las distribuciones de UNIX.
find . -regextype posix-extended -regex ".*\.(jpg|gif|png|jpeg)".
find -E /path/to -iregex ".*\.(jpg|gif|png|jpeg)" > log. Usar la -iregexbandera le dice findque coincida con mayúsculas y minúsculas sin distinción.
find /path/to/ -type f -print0 | xargs -0 file | grep -i image
Esto utiliza el filecomando para intentar reconocer el tipo de archivo, independientemente del nombre de archivo (o extensión).
Si /path/too un nombre de archivo contiene la cadena image, entonces lo anterior puede devolver resultados falsos. En ese caso, sugeriría
cd /path/to
find . -type f -print0 | xargs -0 file --mime-type | grep -i image/
find /path -type f \( -iname "*.jpg" -o -name "*.jpeg" -o -iname "*gif" \)
-iname *.jpg, -o -name *.jpeg, -o -iname *gifTodos tienen un formato ligeramente diferente.
en caso de que los archivos no tengan extensión podemos buscar el tipo de archivo mime
find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 ~ /audio|video|matroska|mpeg/) print $1 }'
donde (audio | video | matroska | mpeg) son tipos mime regex
y si quieres eliminarlos:
find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 ~ /audio|video|matroska|mpeg/) print $1 }' | while read f ; do
rm "$f"
done
o eliminar todo lo demás excepto esas extensiones:
find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 !~ /audio|video|matroska|mpeg/) print $1 }' | while read f ; do
rm "$f"
done
observe el ~ en lugar de ~