A maneira mais simples e mais limpa na minha opinião seria usar este comando:
find . -type f -exec mv --backup=numbered {} . \; && find . -maxdepth 1 -type d -exec rm -r {} +
find
comando # 1:
-
.
: pesquisa no diretório de trabalho atual; -
-type f
: procura por arquivos; -
-exec [...]
: executa um comando para cada resultado (usando{} [...] \;
) ou um comando para todos os resultados (usando{} +
); -
mv --backup=numbered . \;
: move cada resultado no diretório de trabalho atual, criando um backup de arquivos com o mesmo nome de arquivo já no diretório de trabalho atual;
find
comando # 2:
-
.
: pesquisa no diretório de trabalho atual; -
-maxdepth 1
: pesquisa apenas no primeiro nível da hierarquia de diretórios de destino; -
-type d
: procura por diretórios; -
-exec [...]
: executa um comando para cada resultado (usando{} [...] \;
) ou um comando para todos os resultados (usando{} +
); -
rm -r {} +
: elimina cada resultado;
Teste em uma hierarquia de diretórios de teste:
user@debian ~/tmp % tree -a
.
├── 1
│ ├── file1
│ ├── file2
│ ├── file3
│ └── .hidden
├── 2
│ ├── file1
│ ├── file2
│ ├── file3
│ └── .hidden
└── 3
├── file1
├── file2
├── file3
└── .hidden
3 directories, 12 files
user@debian ~/tmp % find . -type f -exec mv --backup=numbered {} . \; && find . -type d -exec rm -r {} +
rm: refusing to remove "." or ".." directory: skipping "."
user@debian ~/tmp % tree -a
.
├── file1
├── file1.~1~
├── file1.~2~
├── file2
├── file2.~1~
├── file2.~2~
├── file3
├── file3.~1~
├── file3.~2~
├── .hidden
├── .hidden.~1~
└── .hidden.~2~
0 directories, 12 files