Vou postar mais duas soluções na esperança de que possam ser úteis no futuro. Eles vieram dos administradores do Linux no trabalho. Apenas mostra quantos martelos funcionarão nesta unha!
Solução 1:
Olá Denham,
Estou tendo que fazer algumas suposições aqui, por exemplo, que a parte do diretório com "XXX Season #" sempre será o diretório "fora" (nó folha).
De qualquer forma, eu escreveria um pequeno script. Algo assim deve funcionar (observe as aspas duplas em torno das variáveis, para garantir a captura de todos os espaços nos diretórios):
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
Obviamente, antes de executá-lo com o comando "mv" $ {olddir} "" $ {newdir} "", você deve colocar algo como "echo" $ {olddir} "" $ {newdir} "" para garantir que você obtendo os resultados esperados ou você pode ter outra dor de cabeça :-P
Solução 2:
Olá Denham,
A maior parte da resposta já estava na pergunta. De qualquer forma, executar algo como o seguinte na pasta Series deve funcionar muito bem:
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
Explicação:
• encontre -mindepth 2 -maxdepth 2 -type d (liste os diretórios dois níveis abaixo)
• enquanto lê dir; (loop em cada dir)
• mv -T "$ dir" (mova o dir de origem para ... -T é necessário para obter um erro se as pastas Season não forem exclusivas, ou seja, você não tiver "The Big Bang Theory Season 22 "e" Season 22 "no mesmo diretório)
• dirname" $ dir "retorna o caminho em que o dir é
• basename" $ dir "retorna o nome do diretório
• sed" s /. Season ([0-9] ) $ / Season \ 1 / i "completa a mágica com uma expressão regular que não diferencia maiúsculas de minúsculas.
No meu pequeno teste, funcionou (tente primeiro com um eco antes do 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