Я собираюсь предложить три варианта. Каждая из них - простая однострочная команда, но я предоставлю варианты для более сложных случаев, в основном, в случае, если файлы для обработки смешиваются с другими файлами в той же директории.
MMV
Я бы использовал команду 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 пару лет назад. На самом деле изменение, которое я запросил, так что я рад видеть варианты его использования.
Дальнейшее чтение: Расширение Brace на информационных страницах 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])
Аргумент in loop представляет собой еще один расширенный глобус, соответствующий одной или нескольким цифрам, на тот случай, если у вас есть файлы, которые начинаются одинаково, но не заканчиваются на число.
ARG_MAX
пределом оболочки . Поскольку этот вопрос явно требует решения для командной строки, (возможно, равные) решения с графическим интерфейсом, как и в другом вопросе, также не совпадают.