Saltar al contenido

Cambiar el nombre de los archivos invirtiendo el orden de los números

Verificamos profundamente cada uno de los posts de nuestra web con el objetivo de mostrarte siempre información certera y actualizada.

Solución:

Con zsh:

autoload zmv # best in ~/.zshrc

typeset -A c=()
zmv -n '(*)_<->.txt(#qnOn)' '$1_$((++c[$(b)1])).txt-renamed' &&
  : zmv '(*)-renamed' '$1'

(quitar el -n (ejecución en seco) y :, si está satisfecho (y recuerde reiniciar c=() antes de ejecutar de nuevo sin ejecución en seco)).

  • <->: es como <1-12> para hacer coincidir números decimales en un rango, pero aquí sin límite especificado, por lo que coincide con cualquier secuencia de uno o más dígitos decimales. También se podría escribir [0-9]## donde ## es zshequivalente de ERE +.
  • (#q...) es el explícito sintaxis para especificar calificadores globales.
  • n: ordena numéricamente
  • On: ordena por nombre al revés. Así que con n anterior, que ordena la lista de archivos coincidentes numéricamente al revés.
  • Para el reemplazo, $1 contiene lo que está capturado en (*), por lo que la parte anterior _.txt.
  • anexamos $((++c[$(b)1])), donde $c es el asociativo array declarado anteriormente.
  • $(b)1 es $1 con caracteres globales escapados (sin él, no funcionaría correctamente si $1 contenido ]).
  • lo hacemos en 2 etapas (añadir un -renamed sufijo que se elimina en la segunda etapa), para evitar sobrescribir archivos en el proceso.

En su muestra, eso da:

mv -- data2_2.txt data2_1.txt-renamed
mv -- data2_1.txt data2_2.txt-renamed
mv -- data1_3.txt data1_1.txt-renamed
mv -- data1_2.txt data1_2.txt-renamed
mv -- data1_1.txt data1_3.txt-renamed

mv -- data1_1.txt-renamed data1_1.txt
mv -- data1_2.txt-renamed data1_2.txt
mv -- data1_3.txt-renamed data1_3.txt
mv -- data2_1.txt-renamed data2_1.txt
mv -- data2_2.txt-renamed data2_2.txt

Tenga en cuenta que técnicamente, no invertir el orden, o solo lo hace en el caso de que los números se incrementen en uno y comiencen en 1 como en su muestra. Convertirá todo [1, 2, 3], [4, 5, 6], [0, 10, 20] a [3, 2, 1].

Para invertir la lista, sería un poco más complicado. Podría ser algo como:

all_files=(*_<->.txt(n))
prefixes=($all_files%_*)

for prefix ($(u)prefixes) 
  files=($(M)all_files:#$prefix_<->.txt)
  new_files=($(Oa)^files-renamed)
  for old new ($files:^new_files)
    echo mv -i -- $old $new-renamed

(retirar echo cuando es feliz).

y ejecuta el zmv '(*)-renamed' '$1' de nuevo como segunda fase.

En una muestra diferente con un adicional [0, 3, 10, 20] lista como un tercer ejemplo, que da:

mv -i -- data1_1.txt data1_3.txt-renamed
mv -i -- data1_2.txt data1_2.txt-renamed
mv -i -- data1_3.txt data1_1.txt-renamed
mv -i -- data2_1.txt data2_2.txt-renamed
mv -i -- data2_2.txt data2_1.txt-renamed
mv -i -- data3_0.txt data3_20.txt-renamed
mv -i -- data3_3.txt data3_10.txt-renamed
mv -i -- data3_10.txt data3_3.txt-renamed
mv -i -- data3_20.txt data3_0.txt-renamed

Esas soluciones no suponen qué carácter (o no carácter) pueden contener los nombres de los archivos, no cambiarán el nombre de los archivos a menos que terminen en _.txt. El zmvEl enfoque basado en la protección contra la sobrescritura de archivos nombrados con un -renamed sufijo que habría estado allí de antemano, no el último enfoque (aunque -i causará mv para avisarle antes de que eso suceda). Alternativamente, en lugar de agregar un -renamed sufijo, puede mover el archivo renombrado a un renamed directorio.

Te mostramos las reseñas y valoraciones de los usuarios

Al final de la post puedes encontrar los informes de otros desarrolladores, tú aún tienes la habilidad mostrar el tuyo si lo deseas.

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



Utiliza Nuestro Buscador

Deja una respuesta

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