Indo da sua estrutura de diretórios:
$ tree
.
├── a
│ └── b
│ └── a.h5
├── b
│ ├── b
│ │ └── e.h5
│ └── c
│ ├── a.h5
│ └── b.h5
├── c
│ └── b
│ └── a.h5
├── d
│ ├── a.h5
│ └── e.h5
└── e
└── e.h5
12 directories, 8 files
Use este loop for
:
$ for f in */*/*.h5; do mv -v -- "$f" "${f%/*}/../"; done
»a/b/a.h5“ -> »a/b/../a.h5“
»b/b/e.h5“ -> »b/b/../e.h5“
»b/c/a.h5“ -> »b/c/../a.h5“
»b/c/b.h5“ -> »b/c/../b.h5“
»c/b/a.h5“ -> »c/b/../a.h5“
O resultado :
$ tree
.
├── a
│ ├── a.h5
│ └── b
├── b
│ ├── a.h5
│ ├── b
│ ├── b.h5
│ ├── c
│ └── e.h5
├── c
│ ├── a.h5
│ └── b
├── d
│ ├── a.h5
│ └── e.h5
└── e
└── e.h5
12 directories, 8 files
Explicação :
for f in */*/*.h5; do mv -v -- "$f" "${f%/*}/../"; done
-
for f in */*/*.h5
faz um loop por todos os arquivos desejados-
mv -v --
move-os, verbosamente.--
impede que nomes de arquivos com traços sejam interpretados como argumentos. -
"$f"
do nome do arquivo original -
${f%/*}/../
o nome do diretório que contém o arquivo../
adicionado. Esse caminho é interpretado como "um diretório para cima".
-