Я пропоную три варіанти. Кожна команда є простою однорядковою командою, але я запропоную варіанти для більш складних випадків, головним чином, якщо файли, які обробляються, змішані з іншими файлами в тій же дирекції.
ммв
Я використовував би команду mmv
з однойменного пакету :
mmv '*HBO_DPM*' '#1dpm#2'
Зауважте, що аргументи передаються у вигляді рядків, тому розширення глобального типу не відбувається в оболонці. Команда отримує рівно два аргументи, а потім знаходить відповідні файли внутрішньо, без жорстких обмежень щодо кількості файлів. Також зауважте, що команда вище передбачає, що всі файли, які відповідають першому глобусу, повинні бути перейменовані. Звичайно, ви можете бути більш конкретними:
mmv 'sb_606_HBO_DPM_*' 'sb_606_dpm_#1'
Якщо у вас є файли поза запитуваним діапазоном чисел у тому самому каталозі, можливо, вам буде краще пройти цикл за номерами, наведеними далі у цій відповіді. Однак ви також можете використовувати послідовність викликів mmv з відповідними шаблонами:
mmv 'sb_606_HBO_DPM_0089*' 'sb_606_dpm_0089#1' # 0089000-0089999
mmv 'sb_606_HBO_DPM_009*' 'sb_606_dpm_009#1' # 0090000-0099999
mmv 'sb_606_HBO_DPM_01[0-5]*' 'sb_606_dpm_01#1#2' # 0100000-0159999
mmv 'sb_606_HBO_DPM_016[0-2]*' 'sb_606_dpm_016#1#2' # 0160000-0162999
mmv 'sb_606_HBO_DPM_01630[01]?' 'sb_606_dpm_01630#1#2' # 0163000-0163019
mmv 'sb_606_HBO_DPM_016302[0-2]' 'sb_606_dpm_016302#1' # 0163020-0163022
петля над числами
Якщо ви хочете нічого не встановлювати, або вам потрібно вибрати номер діапазону, уникаючи збігів поза цим діапазоном, і ви готові чекати 74,023 викликів команд, ви можете використовувати звичайний цикл bash:
for i in {0089000..0163022}; do mv sb_606_HBO_DPM_$i sb_606_dpm_$i; done
Тут це особливо добре працює, оскільки в послідовності немає прогалин. В іншому випадку ви можете перевірити, чи існує вихідний файл.
for i in {0089000..0163022}; do
test -e sb_606_HBO_DPM_$i && mv sb_606_HBO_DPM_$i sb_606_dpm_$i
done
Зауважте, на відміну від for ((i=89000; i<=163022; ++i))
від розширення дужок все-таки обробляють провідні нулі з часу випуску Bash пару років тому. Насправді я вимагав зміни, тому я радий бачити випадки використання.
Подальше читання: Розширення дужок на інформаційних сторінках Bash, зокрема частині про{x..y[..incr]}
.
петля над файлами
Іншим варіантом може бути перехід на відповідний глобус, а не просто перекидання цілого діапазону. Щось на зразок цього:
for i in *HBO_DPM*; do mv "$i" "${i/HBO_DPM/dpm}"; done
Знову це одне mv
виклик на файл. І знову цикл перебуває над довгим списком елементів, але весь список не передається як аргумент підпроцесу, а обробляється внутрішньо bash, тому обмеження не створюватиме вам проблем.
Подальше читання: Розширення параметрів оболонки на інформаційних сторінках Bash, документування${parameter/pattern/string}
серед інших.
Якщо ви хочете обмежити діапазон номерів до вказаного вами, ви можете додати чек для цього:
for i in sb_606_HBO_DPM_+([0-9]); do
if [[ "${i##*_*(0)}" -ge 89000 ]] && [[ "${i##*_*(0)}" -le 163022 ]]; then
mv "$i" "${i/HBO_DPM/dpm}"
fi
done
Тут ${i##pattern}
видаляє найдовший префікс зіставлення pattern
з $i
. Цей найдовший префікс визначається як що-небудь, то підкреслення, то нуль або більше нулів. Останнє записується як *(0)
розширений глобусний шаблон, який залежить від встановленого extglob
варіанту . Видалення провідних нулів важливо, щоб число було розглянуто як базу 10, а не базу 8. +([0-9])
Аргумент циклу - це ще один розширений глобул, що відповідає одній або більше цифр, на випадок, якщо у вас є файли, які починаються однаково, але не закінчуються на число.
ARG_MAX
обмеженням оболонки . Оскільки це запитання прямо вимагає рішення командного рядка, (можливо, рівне) рішення GUI, як і в іншому питанні, також не відповідають.