BASH: автоматическое переименование файлов

Linux / Bash: Переименовать все графические файлы в текущем, либо в заданном каталоге с помощью стандартного Bash скрипта .sh

 Работая в виртуальной среде Linux на мобильном устройстве Android через Termux, возникла нездоровая потребность переименовать множество графических файлов, по шаблону 00001.png, 00002.png и т.д.

В сети обнаружил немало вариантов: короткие команды, длинные, очень длинные, блоки кода и прочее, у всех есть свои недостатки и преимущества. В итоге, изрядно подпалив стул, собрал из кусочков кода следующий вариант скрипта (один из многих вариантов):

Bash:
#!/bin/bash

echo
c=1
shopt -s extglob
for i in "/INPUT/"*.@(png|jpg|jpeg); do
  newname=$(printf "%05d" "$c")
  mv -v -i -- "$i" "/INPUT/${newname}.${i##*.}"
  let c="$c+1"
done
echo

  Кратко: переименует все файлы в папке /INPUT, которые имеют расширение .png .jpg или .jpeg (добавьте в скрипт нужные типы через разделитель | ) по шаблону 00001.jpg, 00002.jpg и т.д.
Для увеличения или уменьшения количества нолей в имени, изменяйте значение "%05d" в скрипте ("%03d" - 001.jpg, "%04d" - 0001.jpg и так далее, )
Путь к файлами задаётся на свое усмотрение (его вообще может не быть, если файлы находятся в той же папке что и скрипт), также не забывайте указывать путь, куда будут помещаться переименованные файлы (допускается одинаковый путь, как в примере выше, в этом случае, на месте файлов со старыми названиями, появятся новые - нумерованные файлы)
Скрипт отлично работает с пробелами, точками и дефисами в именах входных файлов, также корректно обрабатывает пробелы содержащиеся в именах папок указанных в пути.


UPDATE: 21.05.2026

Для особо дотошных субъектов: версия скрипта с предварительной сортировкой по дате изменения файла

Командой ls -tr отсортируем входные файлы по времени последнего изменения и выведем в обратном порядке (самый старый вверху, самый новый внизу) для последующего переименования, самый старый файл получит имя 00001, а самый новый - конечный номер.
Также пришлось добавить параметр IFS=$'\n' - никак не удавалось заставить команду ls корректно обрабатывать пробелы в именах файлов и пробелы в именах папок, которые присутствуют в пути.

Bash:
#!/bin/bash

DefaultIFS=${IFS-$(printf " \t\n")}

echo
c=1
shopt -s extglob
IFS=$'\n'
for i in $(ls -tr "/sdcard/INPUT/"*.@(png|jpg|jpeg)); do
  newname=$(printf "%05d" "$c")
  mv -v -i -- "$i" "/sdcard/INPUT/${newname}.${i##*.}"
  let c="$c+1"
  echo
done
IFS="$DefaultIFS"
echo

Добавлено: 20.05.2026, 03:30 | Последнее обновление: 21.05.2026, 04:07

Comments

Popular posts from this blog

BATch Processing: автоматическое удаление файлов и папок в каталоге

BATch Processing: автоматическое переименование файлов