Переместить диапазон пронумерованных файлов и изменить их значение

У меня есть пронумерованные файлы (от DSC_0001.jpg до DSC_0065.jpg), я знаю, как их переместить mv DSC_{0001..0065}.jpg dir,

Я понятия не имею, как их перемещать и изменять диапазон значений.

mv DSC_{0001..0065}.jpg DSC_{0134..1198}.jpg не работает.

Есть ли другой способ сделать это?

1 ответ

Решение

Вот сценарий, отлаженный и значительно улучшенный благодаря Kamil Maciorowski:

#!/bin/bash
for i in {0065..0001}; do
  n="$(printf '%04d' "$((10#$i + 133))")"
  mv DSC_$i.jpg DSC_$n.jpg
done

Заметки:

  • Мы рассчитываем назад ({0065..0001}не {0001..0065}) потому что цифры будут увеличены. В данном конкретном случае проблема не ударит вас, но представьте, что ваш диапазон {0001..0150}, Обработка форвардов, самая первая mv перезаписал бы номер файла 0134, В этом случае было бы крайне важно сначала переместить файлы с большими номерами, чтобы предотвратить потерю данных. При перемещении в другой (пустой) каталог (вместо просто переименования файлов в одном каталоге) проблема не существует.
  • 10#$i силы базы-10 для этого $i в арифметике оболочек; без него ведущий ноль вызовет основание-8, следовательно, ошибки для чисел, таких как 0008 который не является действительным восьмеричным числом.
  • %04d отформатировать в printf отвечает за ведущие нули в выводе (например, 0134 вместо просто 134). В этом конкретном случае n=0$((10#$i + 133)) также будет работать только потому, что наши $((…)) каждый раз выдает трехзначное число.
Другие вопросы по тегам