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

У меня есть большое количество файлов с именем "img800400_497708.307247.png", и я хотел бы изменить все точки (точки) на подчеркивание с помощью консоли. Как я могу это сделать?

2 ответа

Решение

Вы можете сделать это довольно легко с rename команда. Единственная проблема - сохранение расширения. Мы начинаем с замены всех точек, но затем заменяем _png с .png, Вам, очевидно, нужно будет адаптировать это для других типов расширений.

cd /path/to/images
rename 's/\./_/g; s/_png$/.png/' *.png -vn

Обратите внимание -vn в конце покажет только то, что он будет делать. Это триггер безопасности. Проверьте, что команда делает то, что вы хотите, а затем удалите эту последнюю часть.

Супер-простой тестовый жгут:

$ touch file.{01..10}.png
$ rename 's/\./_/g; s/_png$/.png/' *.png -vn
file.01.png renamed as file_01.png
file.02.png renamed as file_02.png
file.03.png renamed as file_03.png
file.04.png renamed as file_04.png
file.05.png renamed as file_05.png
file.06.png renamed as file_06.png
file.07.png renamed as file_07.png
file.08.png renamed as file_08.png
file.09.png renamed as file_09.png
file.10.png renamed as file_10.png

Решение bash, которое удаляет расширение, заменяет точки подчеркиванием, а затем добавляет расширение:

for f in *.png; do g="${f%.*}"; echo mv -- "$f" "${g//./_}.png"; done

Удалить echo как только вы убедились, работает ли это. Это может быть довольно легко распространено на общее .ext расширение, если у вас есть более одного типа файла, например

for f in *.*; do g="${f%.*}"; e="${f##*.}"; echo mv -- "$f" "${g//./_}.$e"; done
Другие вопросы по тегам