Как переименовать многие файлы из любых последовательных имен файлов?

У меня есть каталог с 8000 изображениями. Они имеют множество имен файлов и имеют тип jpeg или png.

Я хочу переименовать их в:

pic00001.png pic00002.jpg 

Я не возражаю, если я в конечном итоге делаю pngs за один проход, а jpegs в другом, заканчивая двумя слегка перекрывающимися наборами – pic00001.png, pic00002.png и pic00001.jpeg, pic00002.jpeg

Текущие вопросы по переименованию SE охватывают массовое переименование, если вы берете существующее имя файла и добавляете или удаляете статическую информацию. Я этого не делаю. Я заменяю полное имя файла на увеличивающееся число.

  • «. ~ / .bashrc "не устанавливает переменные, как ожидалось, в вызывающем скрипте
  • Запуск emacsclient со сценарием
  • Как передать массив скрипту bash?
  • Искать каталоги для многострочной строки
  • Как я могу разбить буквы слова с четырьмя буквами в строке?
  • Как создать список элементов под определенными заголовками в текстовом документе? (Linux / Bash)
  • Можно ли использовать shebang для самого источника файла в текущей среде bash?
  • автоматизировать построение gnuplot с помощью bash
  • One Solution collect form web for “Как переименовать многие файлы из любых последовательных имен файлов?”

    Вы можете сделать это с помощью цикла оболочки, например:

     for f in *.jpeg *.png do printf "mv '%s' pic%05d.%s \n" "$f" $((++c)) "${f##*.}" done | sh 

    Эта программа создает одну последовательность с одним запуском серийного номера и сохраняет исходное расширение файла.

    Примечание. Метод создания команд или командных последовательностей и компоновка результата в оболочке является стандартным шаблоном кодирования. Вы можете запустить программу сначала без конечного канала в sh чтобы проверить, подходят ли созданные команды, и если все выглядит нормально, добавьте последний канал. (В отличие от временного добавления echo (как это часто видно) метод pipe-to-shell создает согласованный вывод.)

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

     for f in *.jpeg *.png do ((++c)) new_f=$( printf "pic%05d.%s" $c "${f##*.}" ) mv "${f}" "${new_f}" done 

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

    Linux и Unix - лучшая ОС в мире.