Tengo un directorio que contiene archivos de imagen con nombres como
image1.jpg
image2.jpg
image3.jpg
...
Desafortunadamente, los nombres de las imágenes deben estar basados en cero, por lo que image1.jpg
deberían ser image0.jpg
, image2.jpg
deberían ser, image1.jpg
etc.
Puedo escribir un script para generar comandos mv como estos, ponerlos en un script de shell y luego ejecutarlos:
mv image1.jpg image0.jpg
mv image2.jpg image1.jpg
mv image3.jpg image2.jpg
...
Pero supongo que hay una forma más ordenada de hacerlo en Unix. ¿Así que qué es lo?
command-line
rename
Wes
fuente
fuente
for i in $(seq 0 100); do mv image$[i+1].jpg image$i.jpg; done
)imageN.jpg
aimage0.jpg
y ya está.Respuestas:
El buen viejo perl renombrar:
[Observaciones]
Los números de imagen deben ser mayores que 0.
En caso de que las imágenes sean mayores que 9 y no tengan ceros a la izquierda, use
$(ls -v1 *)
para evitar el golpeteo. Propuesto por @arielf y notado por @Graeme.En caso de duda, utilice también
-v
para verbose y-n
no-action.fuente
perlreref
0
en las fuentes.*
al final con`ls -v1 *`
y estará más seguro de golpear. Irá del número más bajo al más alto.Puede canalizar los
mv
comandos generados abash
. Por lo tanto, no tiene que copiarlos en un script y ejecutarlos. Ver:Y se ejecutará todo lo que se canaliza
bash
.fuente
:)
Sin embargo, resuelve el problema, entonces +1.Puede iterar en la salida de ls, este funciona para su ejemplo:
Debes estar en la misma ruta de tus archivos
fuente
-i
o-n
conmv
, evitará sobrescribir en casos extremos.sort -V
sería mejor en su lugar?sort
no funcionará, se mostraráimage10.jpg
antes, loimage1.jpg
que podría ser un problema. Necesitassort -nk 1.8
como en la respuesta de @ Graeme.sort -V
es una buena idea, lo agregaré a mi respuesta. Sin embargo, podría haber otros casos extremos, solo un buen consejo para agregar este tipo de opciones con preguntas como esta en caso de que alguien copie y termine haciendo algún daño.Lo siguiente parece funcionar para cualquier cosa que se ajuste al patrón
imageNUMBER.jpg
. He colocadoecho
antes delmv
comando para mostrar primero lo que haría el comando; para realizar el cambio de nombre, simplemente elimine elecho
En la primera línea,
ls image*.jpg|sort -V
hará que los archivos JPG se enumeren con números ascendentes en el nombre del archivo. Lax=
línea extrae el número del nombre del archivo. Lay=
línea luego disminuye el número en uno. El nombre de archivo de entrada y ely
número se utilizan en elmv
comando, donde la-i
bandera le notificará antes de sobrescribir un archivo.Para mi pequeña prueba, esto produjo el resultado:
Personalmente, sugiero cambiar el nombre a un nombre de archivo más diferente, ya que ahora el orden en que se procesan los archivos puede marcar una gran diferencia.
fuente
-i
o-n
conmv
, evitará sobrescribir en casos extremos.sort -n
, la-V
opción no existe.El uso del
perl
scriptprename
, que está vinculado para cambiar el nombre de las distribuciones basadas en Debian, también necesita GNUfind
/sort
. Los archivos se colocan en orden ascendente para evitar sobrescribirlos.Quítelo
-n
una vez que esté seguro de que hace lo que quiere. Advertirá sobre los archivos ya existentes antes de hacerlo. Sin embargo, siempre que muestre que los archivos se renombran en orden ascendente, no habrá conflictos cuando se ejecuten de verdad.fuente
Con
zsh
:(eliminar
-n
cuando sea feliz).(n)
es ordenar la lista numéricamente para queimage9.jpg
se renombre antesimage10.jpg
.fuente