ToolActToolAct

Инструмент массового переименования файлов

Добавление префиксов, суффиксов, нумерации, поиск и замена, изменение регистра, изменение расширения — всё в вашем браузере

Добавить файлы

Перетащите файлы сюда или нажмите кнопку ниже

Любой тип и количество файлов, обработка только в браузере — ничего не загружается

Что такое массовое переименование файлов?

Массовое переименование — это операция изменения имён группы файлов за один проход по набору правил. Типичные сценарии: превращение свалки фото с камеры вроде IMG_1234.JPG в 2026-06-trip-001.jpg, добавление префикса @2x_ к экспортированным UI-ассетам, нумерация отсканированных квитанций по дате. Встроенное переименование в macOS Finder поддерживает «Найти и заменить» и формат «имя + счётчик», но не умеет переписывать расширения; Tab-переименование в Проводнике Windows добавляет лишь простую сквозную нумерацию (PowerToys PowerRename даёт regex, но требует отдельной установки). Более сложные задачи обычно отправляются в десктопные приложения вроде ReNamer или Bulk Rename Utility, либо в самописные PowerShell- и shell-скрипты. Этот инструмент разбивает каждую операцию — префикс/суффикс, нумерацию, поиск и замену, регистр, расширение — на наглядный визуальный контрол с живым предпросмотром и обнаружением дубликатов, чтобы вы могли проверить результат до скачивания. Весь процесс выполняется в памяти браузера, поэтому имена файлов с кодами проектов, именами клиентов или личной информацией остаются на машине пользователя.

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

Шаги

  1. Перетащите файлы в зону загрузки или нажмите «Выбрать файлы», чтобы выбрать их — повторное добавление дополняет список
  2. Измените порядок через «Сортировать по имени / размеру» или используйте стрелки вверх/вниз в каждой строке для точной настройки
  3. Настройте правила в трёх блоках: префикс/суффикс, поиск и замена, нумерация, регистр, расширение
  4. Колонка «Новое имя» обновляется в реальном времени — синий означает отличие от оригинала, красный — конфликт с другим файлом
  5. Нажмите «Скачать этот файл» для сохранения отдельных файлов или «Скачать как ZIP», чтобы получить всё сразу

Порядок применения правил

  • Сначала заменяется базовое имя (оставьте пустым, чтобы сохранить оригинал) — полезно, когда нужно, чтобы все файлы превратились, например, в "photo" + порядковый номер, независимо от исходного имени
  • Затем поиск/замена применяется только к базовому имени, никогда к расширению
  • Далее вставляется нумерация — как префикс, суффикс или полная замена базового имени
  • Префикс и суффикс оборачивают результат
  • Преобразование регистра и обработка расширения — в самом конце; расширение обрабатывается независимо

Применение

Упорядочивание фото с камеры/телефонаИмена по умолчанию вроде DSC_0001.JPG или IMG_1234.JPG не несут смысловой нагрузки. Добавление префикса с датой или темой и порядкового номера делает альбомы читаемыми с первого взгляда. Опция «Нижний регистр расширения» предотвращает смешение JPG/jpg, которое ломает регистрозависимые файловые системы (Linux) при синхронизации с регистронезависимых (Windows/macOS).
Именование iOS-ассетовЭкспорт дизайнеров вроде "icon-home @2x.png" можно пакетно превратить в "icon-home@2x.png", соответствующий конвенциям Xcode Asset Catalog. С помощью поиска и замены уберите пробелы, затем переведите базовое имя в нижний регистр, чтобы избежать сбоев загрузки из-за чувствительности к регистру в продакшене.
Нормализация Android drawable-имёнAndroid требует, чтобы имена ресурсов были полностью в нижнем регистре, в snake_case и без ведущих цифр. Экспорт со смешанным регистром вроде IcHomeActive.png или ic-home-active.png можно за один проход свести к ic_home_active.png: замените `-` на `_`, переведите базу в нижний регистр и расширение тоже в нижний регистр.
Архивирование квитанций/договоров по месяцамОтсканированные файлы вроде scan001.pdf–scan100.pdf не имеют архивного контекста. Установите базовое имя «2026-06-receipts-» с трёхзначной нумерацией с ведущими нулями, получив «2026-06-receipts-001.pdf». Сортировка по имени теперь равна сортировке по дате, а один ZIP оборачивает весь месяц.
Стандартизация медиаклипов для монтажаМонтажёрам часто нужно переименовать многокамерный материал по сценам, например GH010001.MP4 от GoPro → SceneA_take01.mp4. Используйте поле базового имени, чтобы стереть оригинал, включите нумерацию, переведите расширение в нижний регистр — вся партия выстроится по алфавиту в вашей NLE для упрощения многокамерной синхронизации.
Удаление конфиденциальных или избыточных фрагментов из имёнЭкспортированные файлы часто несут суффиксы вроде (1), (copy) или _final_v2_FINAL. Поиск и замена очищает их за один проход. Файлы, содержащие коды клиентов/проектов, можно пакетно превратить в анонимные коды перед внешней передачей. Всё происходит в памяти браузера — оригиналы никогда не покидают устройство.
Нормализация статических ассетов для вебаПеред загрузкой в CDN или объектное хранилище нормализуйте пробелы, не-ASCII символы и заглавные буквы, чтобы избежать ловушек URL-кодирования. Замените пробелы на дефисы, переведите базу в нижний регистр, расширение в нижний регистр — один проход даст SEO-дружественные и кросс-системно безопасные имена ассетов.

Как это работает

Весь инструмент работает на File API, Blob и URL.createObjectURL браузера — каждый байт остаётся в памяти. Когда вы перетаскиваете или выбираете файлы, браузер передаёт JavaScript объекты File (наследники Blob) в куче JS; инструмент читает только свойство `name` каждого файла для переименования, никогда не касаясь бинарного содержимого. Правила применяются в фиксированном порядке, чтобы избежать взаимовлияния: сначала определяется базовое имя (заданное пользователем или оригинальное), а расширение отделяется через lastIndexOf('.') (точечные файлы вроде .gitignore считаются только базой, без расширения); затем поиск/замена выполняется как String.prototype.split + Array.prototype.join (без regex — чтобы избежать непреднамеренного срабатывания на спецсимволах); далее вычисляется порядковый номер через `String(start + i).padStart(pad, '0')` и помещается как префикс/суффикс/замена базы; префикс и суффикс оборачивают; преобразование регистра применяется ко всей строке префикс+база+суффикс целиком сразу после их объединения; расширение обрабатывается независимо (keep/upper/lower/replace). Обнаружение дубликатов подсчитывает каждое новое имя в Map<string, number> во время предпросмотра; имена, встречающиеся более одного раза, попадают в duplicateSet, который UI подсвечивает красным. Если нажать «Скачать как ZIP», когда duplicateSet не пуст, появится тост с ошибкой и упаковка прервётся — исходный список файлов сохраняется, так что вы можете подправить правила и попробовать снова. Это работает внутри useMemo([files, opts]), поэтому изменения правил инкрементально пересчитываются без повторного рендеринга списка файлов. Загрузка одного файла оборачивает File через URL.createObjectURL, инициирует синтетический клик по `<a download>` и немедленно отзывает URL. Упаковка в ZIP динамически импортирует JSZip при первом клике (~80 КБ, без затрат на первый рендер), читает arrayBuffer() каждого файла, записывает его под новым именем и вызывает generateAsync({type:'blob', compression:'DEFLATE', compressionOptions:{level:6}}). DEFLATE — стандартный метод ZIP; уровень 6 балансирует степень сжатия и скорость. Вычисление правил имеет сложность O(n) от количества файлов; время упаковки масштабируется с общим объёмом байт. Браузеры, как правило, читают содержимое File лениво — arrayBuffer() является моментом, когда байты реально покидают диск — поэтому даже тысячи файлов в очереди почти ничего не стоят на этапе предпросмотра, а пик памяти достигается только при «Скачать как ZIP».

  • lastIndexOf('.') отделяет расширение; если единственная точка стоит в позиции 0 (например, .gitignore), у файла нет расширения и ведущая точка остаётся в базовом имени
  • Поиск и замена использует String.prototype.split + Array.prototype.join вместо replaceAll, избегая случайной интерпретации $1/$& в строке замены
  • padStart(pad, '0') генерирует число с ведущими нулями; pad=0 выводит число без выравнивания для случаев, когда оно не нужно
  • Преобразование регистра выполняется после объединения префикса и суффикса, поэтому оно нормализует весь сегмент базы целиком; расширение обрабатывается независимо
  • Обнаружение дубликатов работает внутри useMemo с Map; пересчёт O(n), а UI лишь меняет className для подсвеченных строк — без перестроения DOM
  • Blob URL немедленно отзываются через URL.revokeObjectURL для освобождения пула выделения URL, поскольку зарезервированные object URL быстро накапливаются при интенсивном использовании
  • JSZip загружается через динамический import только при запуске упаковки, поэтому ~80 КБ кода никогда не влияют на первый рендер или LCP
  • DEFLATE уровня 6 — оптимальная точка на стороне браузера; уровень 9 добавляет 1–2% сжатия за 2–3-кратное время и почти не помогает для уже сжатых изображений/видео

Примеры

Префикс + 3-значная нумерация с ведущими нулями

Вход: photo.jpg, sunset.jpg, beach.jpg
Правила: prefix=trip2026_, start=1, pad=3, position=after
Выход:
trip2026_photo001.jpg
trip2026_sunset002.jpg
trip2026_beach003.jpg

Полная замена базового имени

Вход: GH010001.MP4, GH010002.MP4, GH010003.MP4
Правила: base=SceneA_take, start=1, pad=2, position=after, ext=lowercase
Выход:
SceneA_take01.mp4
SceneA_take02.mp4
SceneA_take03.mp4

Удаление избыточного суффикса через поиск/замену

Вход: report_v1_FINAL.docx, summary_v1_FINAL.docx
Правила: find=_v1_FINAL, replace=(пусто), case=lowercase
Выход:
report.docx
summary.docx

Замена расширения

Вход: index.htm, about.htm, contact.htm
Правила: extension=replace, new ext=html
Выход:
index.html
about.html
contact.html

Префикс + пробел в дефис + нижний регистр

Вход: Banner Image.PNG, Hero Photo.JPG
Правила: prefix=web-, find=(пробел), replace=-, case=lowercase, extension=lowercase
Выход:
web-banner-image.png
web-hero-photo.jpg

Часто задаваемые вопросы

Загружаются ли мои файлы на сервер?

Нет. От добавления файлов до формирования новых имён и упаковки в ZIP — всё работает локально в браузере. Никаких запросов на загрузку не отправляется. Это можно проверить во вкладке Network инструментов разработчика браузера.

Почему мой .gitignore / .bashrc не считается файлом с расширением?

Инструмент разделяет имя по последней точке, но если единственная точка стоит в самом начале (точечный файл), всё имя считается базой — это позволяет не принимать маркер скрытого префикса за расширение.

Что произойдёт, если новые имена столкнутся?

В списке предпросмотра дубликаты подсвечиваются красным и показывается значок счётчика. Нажатие «Скачать как ZIP» при наличии дубликатов блокируется с сообщением об ошибке — список файлов не теряется, просто скорректируйте правила и попробуйте снова. Типичные решения: включить нумерацию, увеличить ширину ведущих нулей, добавить префикс/суффикс.

Можно ли переименовывать папки / сохранять вложенность?

Пока нет. Текущая версия работает с одним плоским списком файлов. Для массового переименования с учётом каталогов сначала переименуйте файлы здесь, а затем соберите дерево каталогов с помощью инструмента упаковки в ZIP.

Поддерживает ли поиск и замена регулярные выражения?

Нет. Используется буквальное сопоставление строк (split-join) намеренно, чтобы пользователи случайно не активировали токены строки замены вроде $1 или $& в строке замены. Простое сопоставление покрывает подавляющее большинство задач очистки.

Сколько файлов он может обработать?

Жёсткого ограничения по количеству нет — предпросмотр практически бесплатен. Упаковка ограничена памятью браузера: при очень больших суммарных объёмах (несколько ГБ) выделение единого Blob может не удаться, в этом случае разделите файлы на партии и упаковывайте каждую отдельно.

В скачанном ZIP не-ASCII имена отображаются как «кракозябры». Почему?

JSZip по умолчанию записывает имена файлов в UTF-8, и современные распаковщики (Archive Utility на macOS, Проводник Windows 11, 7-Zip, WinRAR 5+) читают их корректно. Старый Проводник на Windows 7/8 может неверно декодировать не-латинские имена — используйте 7-Zip или Bandizip.

Можно ли отменить переименование, если я ошибся?

Переименование происходит только в момент скачивания — пока вы не нажали «Скачать как ZIP» или «Скачать этот файл», исходные файлы на диске не трогаются. Предпросмотр полностью обратим: очистите правила, отредактируйте их или удалите отдельные файлы из списка. Если вы уже скачали — просто скорректируйте правила и скачайте снова из тех же исходных файлов.