рекурсивно найти все директории, в основном занимаемые изображениями

Вопрос или проблема

Я работаю над очень неорганизованным архивом друга, который охватывает многие годы и содержит много дубликатов и сложную структуру. Я хочу разделить архив на директории, в основном заполненные фотографиями и видео, и загрузить их на сервер immich. А остальное загрузить на сервер seafile.

Перед тем как создавать свою собственную логику, я хотел бы узнать, существует ли что-то готовое или полуготовое.

Сложность в том, что директории с фотографиями и видео могут время от времени содержать другие файлы, такие как миниатюры, “DS_Store” и подобный мусор. Поэтому я не могу полагаться на то, что в них будут только файлы изображений и видео.

Также в других директориях могут время от времени встречаться файлы изображений, но они не должны входить в фотохранилище. Например, его аудиозаписи с изображениями обложки в процессе разработки. Это также означает, что аудио- и видеофайлы, связанные с его CD, должны оставаться в файловом архиве, а не на сервере immich.

В основном ищу предложения, чтобы сделать этот процесс разделения менее громоздким.

PS Рекурсивно перечислить все директории, которые содержат один или несколько jpg-файлов изображений немного связано, но не совсем соответствует задаче здесь.

Заявление “в основном заполненные изображениями” является размытым и, следовательно, почти невозможно осуществить. Вам нужно уточнить это в более конкретный критерий. Вы можете попытаться классифицировать директорию:

for d in * ; do
    echo -n "$d"
    q=$(ls -1 "$d" | wc -l)
    q_JPG=$(ls -1 "$d"*.JPG | wc -l)
    q_CR2=$(ls -1 "$d"*.CR2 | wc -l)
    q_MOV=$(ls -1 "$d"*.MOV | wc -l)
    if [[ $((100*(q_JPG+q_CR2)/q)) > 75 ]] ; then
        echo "Директория с изображениями"
    elif [[ $((100*q_MOV/q)) > 75 ]] ; then
        echo "Директория с видео"
    fi
done

Вам нужно будет создать свой собственный цикл для перебора директорий; цикл for является только примером. Вам также нужно будет создать точные критерии для определения, что директория в основном заполнена изображениями. Например: вы можете считать, что это cd-rip, если в директории есть 2 mp3, даже если весь буклет отсканирован в jpeg.

В zsh:

has_mostly_images() {
  emulate -L zsh -o extendedglob
  local non_hidden_regular_files images
  non_hidden_regular_files=( $REPLY/*(NoN-.) )
  images=( ${(M)non_hidden_regular_files:#*.(#i)(jp(e|)g|png|gif|tif(|f)|svg|bmp)} )
  (( $#non_hidden_regular_files && $#images * 100 / $#non_hidden_regular_files >= 80 ))
}
print -rC1 -- **/*(NDF+has_mostly_images)

Выведет список директорий, где 80% или более неневидимых регулярных файлов имеют расширение из наиболее распространенных типов файлов изображений.

Ответ или решение

Для решения вашей задачи по выделению директорий, преимущественно занятых изображениями и видео, можно использовать различные сценарии на языках командной оболочки, например, на Bash или Zsh. Однако, для начала необходимо четко определить критерии, по которым будем классифицировать директории. Вот пример реализации на Bash:

#!/bin/bash

# Функция для проверки, является ли директория преимущественно занятой изображениями
is_image_primary() {
    local dir="$1"
    local total_files=$(find "$dir" -maxdepth 1 -type f | wc -l)
    local image_files=$(find "$dir" -maxdepth 1 -type f \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" -o -iname "*.gif" -o -iname "*.bmp" -o -iname "*.tiff" \) | wc -l)
    local video_files=$(find "$dir" -maxdepth 1 -type f \( -iname "*.mp4" -o -iname "*.mov" -o -iname "*.avi" -o -iname "*.mkv" \) | wc -l)

    # Проверяем, что более 75% всех файлов - это изображения
    if [ "$total_files" -gt 0 ]; then
        local image_percentage=$(( 100 * image_files / total_files ))
        local video_percentage=$(( 100 * video_files / total_files ))

        if [ "$image_percentage" -ge 75 ] && [ "$video_percentage" -lt 25 ]; then
            echo "$dir - преимущественно изображения"
        elif [ "$video_percentage" -ge 75 ] && [ "$image_percentage" -lt 25 ]; then
            echo "$dir - преимущественно видео"
        fi
    fi
}

# Рекурсивный поиск и проверка всех директорий
export -f is_image_primary

find . -type d -exec bash -c 'is_image_primary "$0"' {} \;

Описание работы скрипта:

  1. Функция is_image_primary: Эта функция принимает директорию в качестве аргумента и подсчитывает общее количество файлов, количество файлов изображений и количество видеофайлов. Она вычисляет процентное соотношение и выводит информацию о типе содержимого директории.

  2. Команда find: Рекурсивно ищет все директории, начиная с текущей, и для каждой из них вызывает функцию is_image_primary.

Критерии классификации:

  • Директорией, преимущественно занятой изображениями, считается та, в которой более 75% файлов — изображения.
  • Директории с видеофайлами также могут быть отфильтрованы, если в них менее 25% изображений.

Замечания:

  • Убедитесь, что вы выполняете этот скрипт в среде, где у вас есть права доступа к файлам.
  • Вы можете адаптировать процентное соотношение в функции is_image_primary в соответствии с вашими предпочтениями.

Таким образом, предложенный скрипт автоматически идентифицирует директории, которые вы можете загрузить на сервер Immich, и позволит вам структурировать архив вашего друга.

Оцените материал
Добавить комментарий

Капча загружается...