Voy a sugerir tres alternativas. Cada uno es un comando simple de una sola línea, pero proporcionaré variantes para casos más complicados, principalmente en el caso de que los archivos a procesar se mezclen con otros archivos en el mismo directorio.
mmv
Me gustaría usar el comando MMV
del paquete del mismo nombre :
mmv '*HBO_DPM*' '#1dpm#2'
Tenga en cuenta que los argumentos se pasan como cadenas, por lo que la expansión global no se produce en el shell. El comando recibe exactamente dos argumentos y luego encuentra los archivos correspondientes internamente, sin límites estrictos en la cantidad de archivos. También tenga en cuenta que el comando anterior asume que todos los archivos que coincidan con el primer glob serán renombrados. Por supuesto, eres libre de ser más específico:
mmv 'sb_606_HBO_DPM_*' 'sb_606_dpm_#1'
Si tiene archivos fuera del rango de números solicitados en el mismo directorio, podría ser mejor con el ciclo sobre los números que figuran más adelante en esta respuesta. Sin embargo, también podría usar una secuencia de invocaciones de mmv con patrones adecuados:
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
recorrer los números
Si desea evitar instalar cualquier cosa, o necesita seleccionar por rango de números evitando coincidencias fuera de este rango, y está preparado para esperar 74,023 invocaciones de comandos, puede usar un bucle bash simple:
for i in {0089000..0163022}; do mv sb_606_HBO_DPM_$i sb_606_dpm_$i; done
Esto funciona particularmente bien aquí ya que no hay espacios en la secuencia. De lo contrario, es posible que desee verificar si el archivo fuente realmente existe.
for i in {0089000..0163022}; do
test -e sb_606_HBO_DPM_$i && mv sb_606_HBO_DPM_$i sb_606_dpm_$i
done
Tenga en cuenta que, en contraste con for ((i=89000; i<=163022; ++i))
la expansión de llaves, maneja los ceros iniciales desde que se lanzó Bash hace un par de años. En realidad, solicité un cambio, así que estoy feliz de ver casos de uso.
Lecturas adicionales: Expansión de llaves en las páginas de información de Bash, particularmente la parte sobre {x..y[..incr]}
.
recorrer los archivos
Otra opción sería recorrer un globo adecuado, en lugar de simplemente recorrer el rango entero en cuestión. Algo como esto:
for i in *HBO_DPM*; do mv "$i" "${i/HBO_DPM/dpm}"; done
Nuevamente, esta es una mv
invocación por archivo. Y de nuevo, el ciclo está sobre una larga lista de elementos, pero la lista completa no se pasa como argumento a un subproceso, sino que se maneja internamente por bash, por lo que el límite no le causará problemas.
Lectura adicional: Expansión de parámetros de Shell en las páginas de información de Bash, documentando ${parameter/pattern/string}
entre otros.
Si desea restringir el rango de números al que proporcionó, puede agregar un cheque para eso:
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
Aquí ${i##pattern}
elimina la coincidencia de prefijo más larga pattern
de $i
. El prefijo más largo se define como cualquier cosa, luego un guión bajo, luego cero o más ceros. Este último se escribe como *(0)
un patrón de globo extendido que depende de la extglob
opción que se configure. Eliminar los ceros a la izquierda es importante para tratar el número como base 10 y no como base 8. El +([0-9])
argumento en el bucle es otro globo extendido, que coincide con uno o más dígitos, en caso de que tenga archivos allí que comiencen igual pero no terminen en un número.
ARG_MAX
límite del shell . Como esta pregunta solicita explícitamente una solución de línea de comandos, las soluciones GUI (posiblemente iguales) como en la otra pregunta tampoco coinciden.