Reordenar los elementos de ruta de un árbol de directorios

Reordenar los elementos de ruta de un árbol de directorios

Tengo un árbol de directorios donde los elementos de la ruta corresponden a propiedades específicas del archivo en una ruta particular. Por ejemplo, algo como esto:

$ tree 
. ─ a ─ 1 ─ y ─ 334f
│   │   └── z ─ 6410
│   └── 2 ─ y ─ e776
└── b ─ 1 ─ y ─ 9828
    └── 2 ─ y ─ 0149
        └── z ─ 563a

Quiero cambiar el orden de los elementos de la ruta para poner la parte (x|y) primero, luego (1|2), luego (a|b). (Por ejemplo, ./a/1/y/334fdebería convertirse en ./y/1/a/334f.)

El árbol final completo debería ser:

$ tree
. ─ y ─ 1 ─ a ─ 334f
│   │   └── b ─ 9828
│   └── 2 ─ a ─ e776
│       └── b ─ 0149
└── z ─ 1 ─ a ─ 6410
    └── 2 ─ b ─ 563a

¿Cómo hago esto?

Respuesta1

Cree los directorios de destino:

for d in */*/*;do mkdir -p $(echo $d | sed -r 's:(.+)/(.+)/(.+):\3/\2/\1/:'); done

Mover los archivos:

for d in */*/*;do mv $d/* $(echo $d | sed -r 's:(.+)/(.+)/(.+):\3/\2/\1/:'); done

(Esta versión se quejará de que no hay archivos en los directorios creados en el paso 1; puede mejorarlos */*/*o crear los directorios de destino en otro lugar)

información relacionada