
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/334f
deberí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)