Переместить диапазон пронумерованных файлов и изменить их значение
У меня есть пронумерованные файлы (от 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))также будет работать только потому, что наши$((…))каждый раз выдает трехзначное число.