Ответы:
find /path/to -regex ".*\.\(jpg\|gif\|png\|jpeg\)" > log
find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -print0
буду работать. Там может быть более элегантный способ.
find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -exec ls -l {} \;
противном случае exec применяется только к последней части ( -iname '*.jpg'
в данном случае).
find /path/to/ -iname '*.gif' -o -iname '*.jpg' -print0
будет печатать только файлы JPG! Здесь вам нужны скобки:find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -print0
find -E /path/to -regex ".*\.(jpg|gif|png|jpeg)" > log
-E
Спасает вас от того , чтобы избежать скобок и трубы в своем регулярном выражении.
-E
опция говорит find
использовать «расширенные регулярные выражения». Некоторые другие инструменты имеют аналогичную опцию, но я не уверен, что эта опция доступна во всех дистрибутивах UNIX.
find . -regextype posix-extended -regex ".*\.(jpg|gif|png|jpeg)"
.
find -E /path/to -iregex ".*\.(jpg|gif|png|jpeg)" > log
. Использование -iregex
флага говорит find
о том, что регистр не должен учитываться.
find /path/to/ -type f -print0 | xargs -0 file | grep -i image
Это использует file
команду, чтобы попытаться распознать тип файла, независимо от имени файла (или расширения).
Если /path/to
или имя файла содержит строку image
, то приведенное выше может возвращать фиктивные совпадения. В этом случае я бы предложил
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 *gif
Все они имеют немного другой формат.
в случае, если файлы не имеют расширения, мы можем искать тип файла MIME
find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 ~ /audio|video|matroska|mpeg/) print $1 }'
где (аудио | видео | matroska | mpeg) - MIME-типы регулярных выражений
& если вы хотите удалить их:
find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 ~ /audio|video|matroska|mpeg/) print $1 }' | while read f ; do
rm "$f"
done
или удалите все, кроме этих расширений:
find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 !~ /audio|video|matroska|mpeg/) print $1 }' | while read f ; do
rm "$f"
done
обратите внимание! ~ вместо ~