BASH: автоматическое переименование файлов
Linux / Bash: Переименовать все графические файлы в текущем, либо в заданном каталоге с помощью стандартного Bash скрипта .sh
Работая в виртуальной среде Linux на мобильном устройстве Android через Termux, возникла нездоровая потребность переименовать множество графических файлов, по шаблону 00001.png, 00002.png и т.д.
В сети обнаружил немало вариантов: короткие команды, длинные, очень длинные, блоки кода и прочее, у всех есть свои недостатки и преимущества. В итоге, изрядно подпалив стул
, собрал из кусочков кода следующий вариант скрипта (один из многих вариантов):
#!/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 корректно обрабатывать пробелы в именах файлов и пробелы в именах папок, которые присутствуют в пути.
#!/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
Comments
Post a Comment