Je vais proposer trois alternatives. Chacun est une simple commande sur une seule ligne, mais je fournirai des variantes pour les cas plus compliqués, principalement au cas où les fichiers à traiter sont mélangés avec d'autres fichiers dans le même répertoire.
mmv
J'utiliserais la commande mmv
du package du même nom :
mmv '*HBO_DPM*' '#1dpm#2'
Notez que les arguments sont passés sous forme de chaînes, donc l'expansion glob ne se produit pas dans le shell. La commande reçoit exactement deux arguments, puis trouve les fichiers correspondants en interne, sans limites strictes sur le nombre de fichiers. Notez également que la commande ci-dessus suppose que tous les fichiers qui correspondent au premier glob doivent être renommés. Bien sûr, vous êtes libre d'être plus précis:
mmv 'sb_606_HBO_DPM_*' 'sb_606_dpm_#1'
Si vous avez des fichiers en dehors de la plage de numéros demandée dans le même répertoire, vous pourriez être mieux avec la boucle sur les numéros donnés plus bas dans cette réponse. Cependant, vous pouvez également utiliser une séquence d'invocations mmv avec des modèles appropriés:
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
boucle sur les nombres
Si vous voulez éviter d'installer quoi que ce soit, ou devez sélectionner par plage de numéros en évitant les correspondances en dehors de cette plage, et que vous êtes prêt à attendre 74 023 appels de commandes, vous pouvez utiliser une boucle bash simple:
for i in {0089000..0163022}; do mv sb_606_HBO_DPM_$i sb_606_dpm_$i; done
Cela fonctionne particulièrement bien ici car il n'y a pas de lacunes dans la séquence. Sinon, vous souhaiterez peut-être vérifier si le fichier source existe réellement.
for i in {0089000..0163022}; do
test -e sb_606_HBO_DPM_$i && mv sb_606_HBO_DPM_$i sb_606_dpm_$i
done
Notez que contrairement à for ((i=89000; i<=163022; ++i))
l'expansion d'accolade, il gère les zéros en tête depuis la sortie de certains Bash il y a quelques années. En fait, un changement que j'ai demandé, donc je suis heureux de voir des cas d'utilisation pour cela.
Pour en savoir plus: Brace Expansion dans les pages d'informations de Bash, en particulier la partie sur {x..y[..incr]}
.
boucler sur des fichiers
Une autre option serait de boucler sur un glob approprié, au lieu de simplement boucler sur la plage entière en question. Quelque chose comme ça:
for i in *HBO_DPM*; do mv "$i" "${i/HBO_DPM/dpm}"; done
Encore une fois, il s'agit d'une seule mv
invocation par fichier. Et encore une fois, la boucle est sur une longue liste d'éléments, mais la liste entière n'est pas passée en argument à un sous-processus, mais gérée en interne par bash, donc la limite ne vous causera pas de problèmes.
Pour en savoir plus: Shell Parameter Expansion dans les pages d'informations de Bash, documentant ${parameter/pattern/string}
entre autres.
Si vous souhaitez restreindre la plage de numéros à celle que vous avez fournie, vous pouvez ajouter une vérification pour cela:
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
Ici , ${i##pattern}
supprime le plus long préfixe correspondant pattern
de $i
. Ce préfixe le plus long est défini comme n'importe quoi, puis un trait de soulignement, puis zéro ou plusieurs zéros. Ce dernier est écrit comme *(0)
ce qui est une extension modèle de glob qui dépend de l' extglob
option définie. La suppression des zéros de tête est importante pour traiter le nombre comme base 10 et non base 8. L' +([0-9])
argument dans la boucle est un autre glob étendu, correspondant à un ou plusieurs chiffres, juste au cas où vous auriez des fichiers qui commencent de la même manière mais ne se terminent pas par un nombre.
ARG_MAX
limite du shell . Comme cette question demande explicitement une solution en ligne de commande, les solutions GUI (éventuellement égales) comme dans l'autre question ne correspondent pas non plus.