script de terminal para cambiar el nombre de las carpetas en un esquema específico

1

Tengo alrededor de cientos de archivos de películas almacenados en una carpeta. el esquema al que nombré cada carpeta es así:

ABCD

para películas con títulos que comienzan con A, B, C o D, por ejemplo. En esta carpeta están las carpetas de películas como esta

Blade Runner 2049 (2017) 0526 20180223Eph

0526 es un número específico para este archivo / carpeta.

Me gustaría cambiar el nombre de todas las carpetas a este esquema:

(0526) Blade Runner 2049 (2017) 20180223Eph

pero no sé cómo hacer esto en mi Mac ?! tenga en cuenta que algunas carpetas no tienen el sufijo como 20180223Eph .

Se debe hacer para todas las películas en un turno: cambiar el nombre de todas usando el buscador sería un poco largo ...

Gracias de antemano,

mnasdaq

    
pregunta m nasdaq 28.02.2018 - 16:52

1 respuesta

1

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.

    
respondido por el user3439894 28.02.2018 - 23:28

Lea otras preguntas en las etiquetas