Para uma solução com quatro subdiretórios, você pode usar algo assim:
for p4 in */*/*/*
do
p3="${p4%/*}" p2="${p3%/*}" d4="${p4/*\/}" d3="${p3/*\/}"
mv "$p4" "$p3/$d3" && mv "$p3" "$p2/$d4"
done
Não faz nenhum erro ao verificar a presença de um diretório de destino antes de tentar a transposição. Nessa situação, você terminará com o terceiro diretório de nível sendo duplicado. Por exemplo, a/b/d
existe e vamos transpor a/b/c/d
, acabaremos com a/b/d/c/c
.
Se você tiver muitos diretórios correspondentes a */*/*/*
, você poderá dividi-lo ainda mais com um loop adicional por nível. Com cuidado, isso evitará a necessidade de obter os caminhos $p2
e $p3
.