В современном мире количество медиа‑файлов растёт экспоненциально: фотографии с телефона, скриншоты, видеозаписи с камер наблюдения, ролики для соцсетей. Без системного подхода к именованию такие файлы быстро превращаются в хаос, а поиск нужного материала становится проблемой. В этой статье мы разберём, почему стоит автоматизировать переименование, какие существуют стратегии именования и как реализовать их с помощью скриптов на разных платформах.
Почему автоматическое переименование так важно?
- Удобство поиска. Имена файлов, содержащие дату, время, место съёмки или описание, позволяют быстро находить нужный материал в файловом менеджере или в поиске системы;
- Снижение риска потери данных. При копировании/переносе файлов часто возникают конфликты одинаковых имён. Автоматический скрипт гарантирует уникальность.
- Подготовка к публикации. Платформы (YouTube, Instagram, фотобанки) часто требуют определённого формата названий.
- Сокращение рутинных действий. Один клик вместо десятков ручных переименований экономит часы работы.
Общие правила именования медиа‑файлов
- Дата и время съёмки. Формат
YYYYMMDD_HHMMSS(например,20230806_143210) удобен для сортировки. - Местоположение. При наличии GPS‑данных можно добавить
_Parisили_NYC. - Краткое описание. Слова через подчёркивание:
_Birthday_Party. - Уникальный идентификатор. Если несколько файлов созданы в одну секунду, добавьте
_001,_002и т.д. - Расширение. Сохраняйте оригинальное расширение (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)
Как использовать:
- Установите зависимости:
pip install exifread moviepy. - Сохраните скрипт, например, как
rename_media.py. - Запустите:
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), чтобы вы могли их исправить вручную.
Как расширить функциональность
Если базовых возможностей недостаточно, можно добавить:
- Поддержку дополнительных форматов. Например,
.heic,.mov,.avi. - Интеграцию с облачными сервисами. Автоматически загружать переименованные файлы в Google Drive, Dropbox или S3.
- Графический интерфейс. С помощью
Tkinter(Python) илиElectronсоздать простое окно с настройками. - Базу данных. Хранить информацию о файлах в SQLite, чтобы позже быстро находить их по тегам.
- Параллельную обработку. Для больших коллекций (10 000+ файлов) использовать
multiprocessingв Python или GNU Parallel в Bash.
Автоматизация переименования изображений и видео – это не просто удобство, а реальный способ поддерживать порядок в цифровой библиотеке. С помощью небольших скриптов на Python, Bash или PowerShell вы получаете гибкую систему, которая:
- Извлекает дату съёмки из метаданных;
- Формирует понятные и уникальные имена;
- Обрабатывает файлы пакетно, экономя часы ручного труда;
- Легко адаптируется под любые требования (добавление места, проекта, номера).
Начните с простого скрипта, протестируйте его на небольшой выборке, а затем масштабируйте процесс под свои нужды. И помните: регулярный бэкап – ваш лучший друг в работе с медиа‑файлами.
Удачной автоматизации!