Saltar al contenido

Bash Script para cambiar el nombre de los archivos según el tamaño

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *