En primer lugar, debo decir que el ejemplo bash
código que se usa en esta respuesta, que se muestra más adelante, no es de ninguna manera sólido, sin embargo ¡hace el trabajo!
Con lo siguiente como ejemplo representativo 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
Luego, después de ejecutar el ejemplo bash
código guardado como bash
script , y ejecute desde el directorio que contiene la estructura jerárquica que se muestra arriba, los resultados para los directorios serán los que se muestran a continuación, y son los resultados deseados según la muestra representativa de estructura jerárquica de directorios mostrada 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 usar el ejemplo bash
código , en Terminal cd
al directorio que contiene el ABCD
, EFGH
, etc. directorios y ejecute los siguientes comandos :
touch rendir; nano rendir
En nano
copie y pegue el ejemplo bash
código , muestre a continuación, en el archivo rendir
y luego presione Control + X y luego Y y luego Ingrese .
Siguiente:
chmod u+x rendir
Ahora que es ejecutable, ejecútalo escribiendo:
./rendir
Luego presione Ingresar para ejecutarlo.
Ejemplo bash
code:
#!/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 está codificado, generará los comandos mv
que se ejecutarán si echo
no estuviera allí. Después de probar y examinar la salida para ver que los comandos mv
están formados correctamente, puede editar rendir
( nano rendir
) y eliminar las dos apariciones de echo
, guardando el archivo , nuevamente usando ( Control + X y luego Y y luego Ingrese ) y ejecutándolo nuevamente.
En este punto, debe tener el resultado deseado tal como se muestra en la segunda estructura jerárquica de directorios tree
que se muestra arriba. Este ejemplo bash
código no explica ninguna desviación de lo que se expresó en el OP y los comentarios al OP.
NOTA: nunca debe ejecutar el código sin haber realizado una copia de seguridad adecuada ni haber probado el código en una copia de muestra de los originales.
Si supiera awk
mejor, me imagino que se podría escribir un awk
programa para manipular la cadena de entrada en la cadena de salida deseada en una sola llamada de awk
, pero no conozco a awk
lo suficientemente bien como para lograrlo.
Nota: El ejemplo bash
código es solo eso y no emplea ningún manejo de errores y está destinado solo a mostrar una de las muchas maneras en que se puede realizar una tarea. La responsabilidad recae siempre sobre el Usuario para agregar / usar el manejo de errores según sea necesario / deseado.