Инструмент массового переименования файлов
Добавление префиксов, суффиксов, нумерации, поиск и замена, изменение регистра, изменение расширения — всё в вашем браузере
Перетащите файлы сюда или нажмите кнопку ниже
Любой тип и количество файлов, обработка только в браузере — ничего не загружается
Что такое массовое переименование файлов?
Массовое переименование — это операция изменения имён группы файлов за один проход по набору правил. Типичные сценарии: превращение свалки фото с камеры вроде IMG_1234.JPG в 2026-06-trip-001.jpg, добавление префикса @2x_ к экспортированным UI-ассетам, нумерация отсканированных квитанций по дате. Встроенное переименование в macOS Finder поддерживает «Найти и заменить» и формат «имя + счётчик», но не умеет переписывать расширения; Tab-переименование в Проводнике Windows добавляет лишь простую сквозную нумерацию (PowerToys PowerRename даёт regex, но требует отдельной установки). Более сложные задачи обычно отправляются в десктопные приложения вроде ReNamer или Bulk Rename Utility, либо в самописные PowerShell- и shell-скрипты. Этот инструмент разбивает каждую операцию — префикс/суффикс, нумерацию, поиск и замену, регистр, расширение — на наглядный визуальный контрол с живым предпросмотром и обнаружением дубликатов, чтобы вы могли проверить результат до скачивания. Весь процесс выполняется в памяти браузера, поэтому имена файлов с кодами проектов, именами клиентов или личной информацией остаются на машине пользователя.
Как использовать
Шаги
- Перетащите файлы в зону загрузки или нажмите «Выбрать файлы», чтобы выбрать их — повторное добавление дополняет список
- Измените порядок через «Сортировать по имени / размеру» или используйте стрелки вверх/вниз в каждой строке для точной настройки
- Настройте правила в трёх блоках: префикс/суффикс, поиск и замена, нумерация, регистр, расширение
- Колонка «Новое имя» обновляется в реальном времени — синий означает отличие от оригинала, красный — конфликт с другим файлом
- Нажмите «Скачать этот файл» для сохранения отдельных файлов или «Скачать как ZIP», чтобы получить всё сразу
Порядок применения правил
- Сначала заменяется базовое имя (оставьте пустым, чтобы сохранить оригинал) — полезно, когда нужно, чтобы все файлы превратились, например, в "photo" + порядковый номер, независимо от исходного имени
- Затем поиск/замена применяется только к базовому имени, никогда к расширению
- Далее вставляется нумерация — как префикс, суффикс или полная замена базового имени
- Префикс и суффикс оборачивают результат
- Преобразование регистра и обработка расширения — в самом конце; расширение обрабатывается независимо
Применение
Как это работает
Весь инструмент работает на 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» или «Скачать этот файл», исходные файлы на диске не трогаются. Предпросмотр полностью обратим: очистите правила, отредактируйте их или удалите отдельные файлы из списка. Если вы уже скачали — просто скорректируйте правила и скачайте снова из тех же исходных файлов.