Reordenar os elementos do caminho de uma árvore de diretórios

Reordenar os elementos do caminho de uma árvore de diretórios

Eu tenho uma árvore de diretórios onde os elementos do caminho correspondem a propriedades específicas do arquivo em um caminho específico. Por exemplo, algo assim:

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

Quero alterar a ordem dos elementos do caminho para colocar a parte (x|y) primeiro, depois (1|2) e depois (a|b). (Por exemplo, ./a/1/y/334fdeveria se tornar ./y/1/a/334f.)

A árvore final completa deve ser:

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

Como eu faço isso?

Responder1

Crie os diretórios de destino:

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

Mova os arquivos:

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

(esta versão irá reclamar que não há arquivos nos diretórios criados na etapa 1, você pode melhorar */*/*ou criar os diretórios de destino em outro lugar)

informação relacionada