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