Te recomendamos que revises esta solución en un entorno controlado antes de enviarlo a producción, un saludo.
Solución:
Algo como esto:
echo "Please rename and press enter"
read rename
ls |
# prepend filename with file size in bytes
parallel stat -c %s,,sep,,%n -- |
# sort by number
sort -n |
# rename to sequencenumber followed by size in bytes
parallel -q --colsep ,,sep,, mv 2 "$rename"#_1
El truco principal es reemplazar
for i in *.jpg
con
for i in $(ls -S *.jpg)
sin embargo, como señaló Kusalananda, esto supone nombres de archivo “educados” (sin espacios, sin caracteres de control), por lo que aquí hay un enfoque diferente:
count=1
ls -S --escape *.jpg | while read f; do
n=$(printf "%04d" $count)
((count++))
mv --no-clobber "$f" "$rename$n.jpg"
done
-S
ordena por tamaño de archivo decreciente--escape
evita que los nombres con saltos de línea incrustados causen daños--no-clobber
evita sobrescribir los archivos de destino en caso de que el script se ejecute dos veces
La respuesta de PS Ole Tange es una manera muy agradable y eficiente de hacer lo mismo, pero probablemente no verá la diferencia a menos que cambie el nombre de miles de archivos de forma rutinaria.
En el zsh
cáscara:
typeset -Z 3 count=0
for name in *.jpg(.DNOL); do
count=$(( count + 1 ))
mv -i -- "$name" "a$count.jpg"
done
Esto iteraría sobre todos los archivos regulares con un .jpg
sufijo de nombre de archivo en el directorio actual, en orden de mayor a menor. Para cada archivo, lo renombraría a aNNN.jpg
donde NNN
es el número entero lleno de ceros de los archivos procesados hasta el momento.
El (.DNOL)
El calificador glob ordena los nombres de archivo coincidentes en el orden correcto usando OL
(“invierte el orden por longitud”), y selecciona solo archivos normales (incluidos los nombres ocultos) usando .D
(“archivos regulares y archivos de puntos”). El N
hace que el patrón se expanda a nada si no hay un nombre coincidente (“null globo”).
Esto funcionaría en todos los nombres de archivo válidos en cualquier sistema Unix con zsh
instalado.
Para usar esto desde bash
:
zsh -c 'typeset -Z 3 count=0
for name in *.jpg(.DNOL); do
count=$(( count + 1 ))
mv -i -- "$name" "a$count.jpg"
done'
Si tienes una variable $rename
que desea pasar como un nombre de archivo prefix En lugar de usar a
:
zsh -c 'typeset -Z 3 count=0
for name in *.jpg(.DNOL); do
count=$(( count + 1 ))
mv -i -- "$name" "$1$count.jpg"
done' zsh "$rename"
Tenga en cuenta que el zsh
en la última línea no es un error tipográfico y que el valor de $rename
se usa como $1
dentro de zsh -c
texto.
valoraciones y comentarios
Si haces scroll puedes encontrar las críticas de otros desarrolladores, tú también tienes la habilidad dejar el tuyo si dominas el tema.