En primer lugar, tengo que decir que el ejemplo bash
código utilizado en esta respuesta, que se muestra más abajo, no significa de ninguna manera robusta, sin embargo, no conseguir el trabajo hecho!
Con el siguiente como una muestra representativa de la estructura jerárquica de directorios:
.
├── ABCD
├── EFGH
├── IJKL
├── MNOP
│ ├── A Most Violent Year (2014) 1180 20150807Lov
│ ├── A Most Wanted Man (2014) 1146
│ ├── A Nightmare on Elm Street (2010) 0432
│ ├── A Perfect Getaway (2009) 0433
│ └── ¡NO! (2012) 0939
├── QRST
├── UVWX
└── YZ
A continuación, después de ejecutar el ejemplo bash
código se guarda como un bash
script, y ejecutar desde el directorio que contiene la estructura jerárquica que se muestran anteriormente, los resultados de los directorios será como se muestra a continuación, y dado que la declaró de salida deseado, basado en la muestra representativa de la estructura jerárquica de directorios que se muestra arriba:
.
├── ABCD
├── EFGH
├── IJKL
├── MNOP
│ ├── (0432) A Nightmare on Elm Street (2010)
│ ├── (0433) A Perfect Geatway (2009)
│ ├── (0939) ¡NO! (2012)
│ ├── (1146) A Most Wanted Man (2014)
│ └── (1180) A Most Violent Year (2014) 20150807Lov
├── QRST
├── UVWX
└── YZ
Para utilizar el ejemplo bash
código, En la Terminal cd
a el directorio que contiene el ABCD
, EFGH
, etc. directorios y ejecutar los siguientes comandos:
touch rendir; nano rendir
En nano
copiar y pegar el ejemplo bash
de código, se muestra a continuación, en la rendir
archivo y, a continuación, presione Control+X y luego Y y luego Enter.
Siguiente:
chmod u+x rendir
Ahora que es ejecutable, ejecutar, escribiendo:
./rendir
A continuación, pulse Enter para ejecutarlo.
Ejemplo bash
código de:
#!/bin/bash
find -E . -type d -regex '.* [0-9]{4}$' > /tmp/foo
while read -r l; do
p="$(dirname "$l")"
d="$(basename "$l")"
n="$(awk '{print "("$NF")"}'<<<"$d")"
f="$(awk '{$NF=""; sub(/ $/, "", $0); print $0}'<<<"$d")"
echo mv "$l" "$p/$n $f"
done</tmp/foo
find -E . -type d -regex '.* [0-9]{4} .*$' > /tmp/foo
while read -r l; do
p="$(dirname "$l")"
d="$(basename "$l")"
n="$(awk '{print "("$(NF - 1)")"}'<<<"$d")"
f="$(awk '{$(NF - 1)=""; print $0}'<<<"$d" | awk 'sub(/ /," ")')"
echo mv "$l" "$p/$n $f"
done</tmp/foo
rm /tmp/foo
Tenga en cuenta que tal como ha sido codificado, que es la salida de la mv
comandos que sería ejecutado si echo
no estaba allí. Después de las pruebas y el examen de la salida para ver que el mv
comandos están debidamente formado, puede editar rendir
(nano rendir
) y retire las dos ocurrencias de echo
, guardar el archivo, utilizando de nuevo (Control+X y luego Y y, a continuación, Enter) y ejecutarlo de nuevo.
En este punto usted debe tener el resultado deseado, como se muestra en la segunda tree
estructura jerárquica de directorios que se muestra arriba. Este ejemplo bash
código no tiene en cuenta cualquier desviación de lo que se expresó en el OP y comentarios a la OP.
NOTA: nunca Se debe ejecutar código sin antes estar debidamente respaldados y / o probar el código en una muestra de copia de los originales.
Si yo supiera awk
mejor que me imagino que un awk
programa puede ser escrito para manipular la cadena de entrada a la deseada salida de cadena en una sola llamada de awk
, pero no sé awk
lo suficientemente bien como para lograr eso.
Nota: El ejemplo bash
código es sólo eso y no emplea ningún error en el manejo y está destinado sólo para mostrar una de las muchas formas de realizar una tarea. La responsabilidad recae siempre sobre el Usuario para agregar y/o el uso apropiado de manejo de errores como necesitaba/quería.