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##
eszsh
equivalente de ERE+
.(#q...)
es el explícito sintaxis para especificar calificadores globales.n
: ordena numéricamenteOn
: ordena por nombre al revés. Así que conn
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 _
. El zmv
El 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.