Вопрос или проблема
Я работаю над очень неорганизованным архивом друга, который охватывает многие годы и содержит много дубликатов и сложную структуру. Я хочу разделить архив на директории, в основном заполненные фотографиями и видео, и загрузить их на сервер 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"' {} \;
Описание работы скрипта:
-
Функция
is_image_primary
: Эта функция принимает директорию в качестве аргумента и подсчитывает общее количество файлов, количество файлов изображений и количество видеофайлов. Она вычисляет процентное соотношение и выводит информацию о типе содержимого директории. -
Команда
find
: Рекурсивно ищет все директории, начиная с текущей, и для каждой из них вызывает функциюis_image_primary
.
Критерии классификации:
- Директорией, преимущественно занятой изображениями, считается та, в которой более 75% файлов — изображения.
- Директории с видеофайлами также могут быть отфильтрованы, если в них менее 25% изображений.
Замечания:
- Убедитесь, что вы выполняете этот скрипт в среде, где у вас есть права доступа к файлам.
- Вы можете адаптировать процентное соотношение в функции
is_image_primary
в соответствии с вашими предпочтениями.
Таким образом, предложенный скрипт автоматически идентифицирует директории, которые вы можете загрузить на сервер Immich, и позволит вам структурировать архив вашего друга.