Автоматическое переименование медиа-файлов

Устал искать нужное фото или видео? Автоматическое переименование файлов навсегда избавит от беспорядка. Узнай, как скрипты спасут твою коллекцию!

В современном мире количество медиа‑файлов растёт экспоненциально: фотографии с телефона, скриншоты, видеозаписи с камер наблюдения, ролики для соцсетей. Без системного подхода к именованию такие файлы быстро превращаются в хаос, а поиск нужного материала становится проблемой. В этой статье мы разберём, почему стоит автоматизировать переименование, какие существуют стратегии именования и как реализовать их с помощью скриптов на разных платформах.


Почему автоматическое переименование так важно?

  • Удобство поиска. Имена файлов, содержащие дату, время, место съёмки или описание, позволяют быстро находить нужный материал в файловом менеджере или в поиске системы;
  • Снижение риска потери данных. При копировании/переносе файлов часто возникают конфликты одинаковых имён. Автоматический скрипт гарантирует уникальность.
  • Подготовка к публикации. Платформы (YouTube, Instagram, фотобанки) часто требуют определённого формата названий.
  • Сокращение рутинных действий. Один клик вместо десятков ручных переименований экономит часы работы.

Общие правила именования медиа‑файлов

  1. Дата и время съёмки. Формат YYYYMMDD_HHMMSS (например, 20230806_143210) удобен для сортировки.
  2. Местоположение. При наличии GPS‑данных можно добавить _Paris или _NYC.
  3. Краткое описание. Слова через подчёркивание: _Birthday_Party.
  4. Уникальный идентификатор. Если несколько файлов созданы в одну секунду, добавьте _001, _002 и т.д.
  5. Расширение. Сохраняйте оригинальное расширение (jpg, png, mp4, mov).

Пример итогового имени:

20230806_143210_Paris_EiffelTower_001.jpg

Инструменты и библиотеки

Платформа Язык/утилита Что делает
Linux / macOS Bash + exiftool, ffmpeg Чтение метаданных, переименование в пакетном режиме.
Windows PowerShell + exiftool, ffprobe Аналогичные возможности, но в PowerShell‑скриптах.
Кроссплатформенно Python (модули os, pathlib, exifread, moviepy) Полный контроль, возможность интеграции с базами данных.

Пример скрипта на Python

Этот скрипт переименовывает все изображения .jpg и видео .mp4 в указанной папке, используя дату съёмки из EXIF (для фото) или из контейнера (для видео).

#!/usr/bin/env python3

import os
import sys
from pathlib import Path
from datetime import datetime
import exifread # pip install exifread
from moviepy.editor import VideoFileClip # pip install moviepy

def get_image_date(filepath: Path) -> datetime:
 """Читает дату съёмки из EXIF (Tag 0x9003 – DateTimeOriginal)."""
 with open(filepath, 'rb') as f:
 tags = exifread.process_file(f, stop_tag='EXIF DateTimeOriginal')
 date_tag = tags.get('EXIF DateTimeOriginal')
 if date_tag:
 return datetime.strptime(str(date_tag), '%Y:%m:%d %H:%M:%S')
 else:
 # fallback – дата создания файла
 return datetime.fromtimestamp(filepath.stat.st_mtime)

def get_video_date(filepath: Path) -> datetime:
 """Получает дату создания из метаданных видео (ffmpeg)."""
 try:
 clip = VideoFileClip(str(filepath))
 # moviepy хранит дату в атрибуте 'creation_time' если она есть
 dt_str = clip.reader.metadata.get('creation_time')
 if dt_str:
 # пример: '2023-08-06T14:32:10.000000Z'
 return datetime.fromisoformat(dt_str.replace('Z', '+00:00'))
 except Exception:
 pass
 # fallback – дата создания файла
 return datetime.fromtimestamp(filepath.stat.st_mtime)

def build_new_name(dt: datetime, original: Path, counter: int) -> str:
 """Формирует новое имя: YYYYMMDD_HHMMSS_001.ext"""
 base = dt.strftime('%Y%m%d_%H%M%S')
 suffix = f'_{counter:03d}'
 return f"{base}{suffix}{original.suffix.lower}"

def rename_media(folder: Path):
 counter = 1
 for path in sorted(folder.rglob('*')):
 if path.is_file and path.suffix.lower in {'.jpg', '.jpeg', '.png', '.mp4', '.mov'}:
 try:
 if path.suffix.lower in {'.jpg', '.jpeg', '.png'}:
 dt = get_image_date(path)
 else:
 dt = get_video_date(path)

 new_name = build_new_name(dt, path, counter)
 new_path = path.with_name(new_name)

 # Проверка на конфликт
 while new_path.exists:
 counter += 1
 new_name = build_new_name(dt, path, counter)
 new_path = path.with_name(new_name)

 print(f"Rename: {path.name} → {new_name}")
 path.rename(new_path)
 counter += 1
 except Exception as e:
 print(f"Error processing {path}: {e}", file=sys.stderr)

if __name__ == '__main__':
 if len(sys.argv) != 2:
 print("Usage: python rename_media.py /path/to/folder")
 sys.exit(1)

 target_folder = Path(sys.argv[1])
 if not target_folder.is_dir:
 print("Error: указанный путь не является папкой")
 sys.exit(1)

 rename_media(target_folder)

Как использовать:

  1. Установите зависимости: pip install exifread moviepy.
  2. Сохраните скрипт, например, как rename_media.py.
  3. Запустите: python rename_media.py /home/user/Media.

Bash‑скрипт с использованием exiftool и ffmpeg

Для пользователей Linux/macOS удобно использовать готовые утилиты.

#!/usr/bin/env bash

shopt -s nullglob # чтобы цикл не падал, если файлов нет

counter=1


for file in .{jpg,JPG,jpeg,mp4,MP4}; do
 if [[ -f "$file" ]]; then
 ext="${file##.}"
 # 1) Попытка взять дату из EXIF (для фото)
 if  "$ext" =~ ^(jpg; then
 datetime=$(exiftool -d "%Y%m%d_%H%M%S" -DateTimeOriginal -s3 "$file")
 else
 # 2) Для видео – используем ffprobe
 datetime=$(ffprobe -v quiet -print_format default=nokey=1:noprint_wrappers=1 
 -show_entries format_tags=creation_time "$file" | 
 head -n1 | cut -d'T' -f1 | tr -d '-')
 time_part=$(ffprobe -v quiet -print_format default=nokey=1:noprint_wrappers=1 
 -show_entries format_tags=creation_time "$file" | 
 head -n1 | cut -d'T' -f2 | cut -d'.' -f1 | tr -d ':')
 datetime="${datetime}_${time_part}"
 fi

 # Если дата не получена – берём дату изменения файла
 if [[ -z "$datetime" ]]; then
 datetime=$(date -r "$file" +"%Y%m%d_%H%M%S")
 fi

 newname=$(printf "%s_%03d.%s" "$datetime" "$counter" "$ext")
 echo "Rename: $file → $newname"
 mv -i "$file" "$newname"
 ((counter++))
 fi
done

Сохраните как rename_media.sh, сделайте исполняемым (chmod +x rename_media.sh) и запустите в нужной папке.


PowerShell‑скрипт для Windows

# Переименование изображений и видео в текущей директории

$counter = 1
Get-ChildItem -File -Include .jpg, .jpeg, .png, .mp4, *.mov | ForEach-Object {
 $file = $_
 $ext = $file.Extension.ToLower
 $dateString = $null

 if ($ext -in ".jpg", ".jpeg", ".png") {
 # Читаем EXIF дату
 $exif = & exiftool -DateTimeOriginal -d "%Y%m%d_%H%M%S" -s3 $file.FullName
 if ($exif) { $dateString = $exif.Trim }
 } else {
 # Для видео используем ffprobe (часть ffmpeg)
 $ffprobe = & ffprobe -v quiet -show_entries format_tags=creation_time `
 -of default=noprint_wrappers=1:nokey=1 $file.FullName
 if ($ffprobe) {
 $dt = [datetime]::Parse($ffprobe)
 $dateString = $dt.ToString("yyyyMMdd_HHmmss")
 }
 }
 if (-not $dateString) {
 # fallback – дата изменения файла
 $dateString = $file.LastWriteTime.ToString("yyyyMMdd_HHmmss")
 }
 $newName = "{0}_{1:D3}{2}" -f $dateString, $counter, $ext
 $newPath = Join-Path $file.DirectoryName $newName

 if (Test-Path $newPath) {
 $counter++
 $newName = "{0}_{1:D3}{2}" -f $dateString, $counter, $ext
 $newPath = Join-Path $file.DirectoryName $newName
 }

 Write-Host "Rename: $($file.Name) → $newName"
 Rename-Item -Path $file.FullName -NewName $newName -ErrorAction Stop
 $counter++
}

Запустите скрипт в PowerShell от имени администратора (если требуется доступ к системным папкам).


Лучшие практики и типичные ошибки

  • Резервное копирование. Перед массовым переименованием всегда делайте копию оригиналов.
  • Проверка метаданных. Не все файлы содержат корректные EXIF‑данные; иногда камера сохраняет только дату создания файла.
  • Уникальность имён. Добавляйте счётчик или UUID, если существует риск дублирования.
  • Кроссплатформенность. При работе в смешанных средах (Linux + Windows) предпочтительнее использовать Python‑скрипт – он одинаково работает везде.
  • Обработка ошибок. Скрипты должны логировать неудачные попытки (например, в файл error.log), чтобы вы могли их исправить вручную.

Как расширить функциональность

Если базовых возможностей недостаточно, можно добавить:

  1. Поддержку дополнительных форматов. Например, .heic, .mov, .avi.
  2. Интеграцию с облачными сервисами. Автоматически загружать переименованные файлы в Google Drive, Dropbox или S3.
  3. Графический интерфейс. С помощью Tkinter (Python) или Electron создать простое окно с настройками.
  4. Базу данных. Хранить информацию о файлах в SQLite, чтобы позже быстро находить их по тегам.
  5. Параллельную обработку. Для больших коллекций (10 000+ файлов) использовать multiprocessing в Python или GNU Parallel в Bash.

Автоматизация переименования изображений и видео – это не просто удобство, а реальный способ поддерживать порядок в цифровой библиотеке. С помощью небольших скриптов на Python, Bash или PowerShell вы получаете гибкую систему, которая:

  • Извлекает дату съёмки из метаданных;
  • Формирует понятные и уникальные имена;
  • Обрабатывает файлы пакетно, экономя часы ручного труда;
  • Легко адаптируется под любые требования (добавление места, проекта, номера).

Начните с простого скрипта, протестируйте его на небольшой выборке, а затем масштабируйте процесс под свои нужды. И помните: регулярный бэкап – ваш лучший друг в работе с медиа‑файлами.

Удачной автоматизации!