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

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

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

pic00001.png pic00002.jpg 

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

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

  • Выполнение скрипта в разрешениях zsh-файла
  • Как сравнить число с плавающей запятой в сценарии оболочки
  • Оператор if и else с использованием diff -q
  • Ошибка сценария после команды bc
  • Выход из сценария оболочки, если некоторые дочерние процессы завершаются
  • Переименовать все пробелы в именах файлов изображений внутри html php-файлов
  • Откройте несколько веб-сайтов один за другим только в одном окне Firefox
  • Почему это «while kill -0 $ PID», а не «до kill -0 $ PID»?
  • 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 - лучшая ОС в мире.