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