Voy a publicar dos soluciones más con la esperanza de que puedan ser útiles en el futuro. Estos vinieron de los administradores de Linux en el trabajo. ¡Solo muestra cuántos martillos funcionarán en este clavo!
Solución 1:
Hola denham
Tengo que hacer algunas suposiciones aquí, por ejemplo, que la parte del directorio con "XXX Season #" siempre será el directorio "externo" (nodo hoja).
En cualquier caso, escribiría un pequeño guión. Algo como esto debería funcionar (tenga en cuenta las comillas dobles alrededor de las variables, para asegurarse de capturar todos los espacios en los directorios):
find /media/Expansion2/Series/ -type d | while read olddir
do
newdir=`echo "${olddir}" | awk -F "/" '$NF ~ /Season/ { last=substr($NF,index($NF, "Season")); while (i<(NF-1)) { i++; printf("/%s", $i) }; printf("/%s\n", last) } $NF !~ /Season/ { print }'`
if [ "${olddir}" != "${newdir}" ]
then
mv "${olddir}" "${newdir}"
fi
done
Por supuesto, antes de ejecutarlo con el comando "mv" $ {olddir} "" $ {newdir} "" debe poner algo como "echo" $ {olddir} "" $ {newdir} "" para asegurarse de que obteniendo los resultados que espera o podría terminar con otro dolor de cabeza :-P
Solución 2:
Hola denham
La mayor parte de la respuesta ya estaba en la pregunta. De todos modos, ejecutar algo como lo siguiente desde la carpeta Serie debería funcionar bien:
find -mindepth 2 -maxdepth 2 -type d | while read dir; do mv -T "$dir" "`dirname "$dir"`/`basename "$dir" | sed "s/.*Season \([0-9]*\)$/Season \1/i"`"; done
Explicación:
• find -mindepth 2 -maxdepth 2 -type d (enumera los directorios dos niveles hacia abajo)
• mientras lee dir; (bucle en cada directorio)
• mv -T "$ dir" (mueva el directorio de origen a ... -T es necesario para obtener un error si las carpetas de la temporada no son únicas, es decir, no tiene "La temporada de la teoría del Big Bang 22 "y" Season 22 "en el mismo directorio)
• dirname" $ dir "devuelve la ruta donde está el dir
• basename" $ dir "devuelve el nombre del directorio
• sed" s /. Season ([0-9] ) $ / Season \ 1 / i "completa la magia con expresiones regulares que no distinguen entre mayúsculas y minúsculas, por si acaso.
En mi pequeña prueba funcionó (pruébalo primero con un eco antes de mv):
someuser@linux-box:/tmp/Series$ find
.
./The Big Bang Theory
./The Big Bang Theory/Season 2
./The Big Bang Theory/Season 2/file1.avi
./The Big Bang Theory/Season 2/file 3.avi
./The Big Bang Theory/Season 2/file2.avi
./The Big Bang Theory/Season 2/file
./The Big Bang Theory/Season 2/3.avi
./The Big Bang Theory/The Big Bang Theory Season 1
./The Big Bang Theory/The Big Bang Theory Season 1/file1.avi
./The Big Bang Theory/The Big Bang Theory Season 1/file 3.avi
./The Big Bang Theory/The Big Bang Theory Season 1/file2.avi
./The Big Bang Theory/The Big Bang Theory Season 1/file
./The Big Bang Theory/The Big Bang Theory Season 1/3.avi
./Other Series
./Other Series/Season 2
./Other Series/Stre dsfdf sd dSeason 3
someuser@linux-box:/tmp/Series$ find -mindepth 2 -maxdepth 2 -type d | while read dir; do mv -T "$dir" "dirname "$dir"
/basename "$dir" | sed "s/.*Season \([0-9]*\)$/Season \1/i"
"; done
mv: ./The Big Bang Theory/Season 2' and
./The Big Bang Theory/Season 2' are the same file
mv: ./Other Series/Season 2' and
./Other Series/Season 2' are the same file
someuser@linux-box:/tmp/Series$ find
.
./The Big Bang Theory
./The Big Bang Theory/Season 2
./The Big Bang Theory/Season 2/file1.avi
./The Big Bang Theory/Season 2/file 3.avi
./The Big Bang Theory/Season 2/file2.avi
./The Big Bang Theory/Season 2/file
./The Big Bang Theory/Season 2/3.avi
./The Big Bang Theory/Season 1
./The Big Bang Theory/Season 1/file1.avi
./The Big Bang Theory/Season 1/file 3.avi
./The Big Bang Theory/Season 1/file2.avi
./The Big Bang Theory/Season 1/file
./The Big Bang Theory/Season 1/3.avi
./Other Series
./Other Series/Season 3
./Other Series/Season 2