1

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

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

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

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

1 ответ1

2

Вот сценарий, отлаженный и значительно улучшенный благодаря Камилю Мачоровски:

#!/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 заставляет base-10 для этого $i в арифметике оболочки; без него ведущий ноль вызовет основание-8, следовательно, ошибки для чисел типа 0008 которые не являются действительными восьмеричными числами.
  • Формат %04d в printf отвечает за начальные нули в выводе (например, 0134 вместо 134). В этом конкретном случае n=0$((10#$i + 133)) также будет работать только потому, что наш $((…)) каждый раз выдает трехзначное число.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .