Script para “extrair” subpastas na pasta pai

5

Isso vai ser um pouco complicado, eu acho: -)

Quando abro um terminal na pasta e executo um script, esse script deve:

  1. move todo o conteúdo de todas as subpastas para uma pasta principal superior (recursivamente)
  2. excluir todas as pastas vazias

A pasta principal em que estamos não conterá pastas, apenas o conteúdo de todas elas.

Deve funcionar também para arquivos e pastas ocultos. Seria imensamente útil para a limpeza da casa: -)

Eu tentei algo como:

find . -type f -name "*" -depth | xargs mv ./

Mas sem sorte.

Obrigado pela sua ajuda: -)

    
por Sebastian 11.08.2015 / 15:14

3 respostas

9

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
    
por kos 11.08.2015 / 15:50
5
  1. Para mover todos os arquivos recursivamente no diretório atual, observe que isso moverá todos os arquivos para esse diretório (não para os diretórios-pai):

    find . -type f -exec mv -i -t . {} +  
    

Em vez de -i , você pode usar --backup=numbered como mostrado por @kos.

  1. Para remover todos os diretórios vazios:

    find . -type d -empty -delete
    

Leia man find para ter mais ideia.

    
por heemayl 11.08.2015 / 16:07
2

Isso deve fazer o truque para você:

find . -type f -exec mv --backup=numbered "{}" . \; && find . -type d -empty -delete

São 2 comandos de busca, o primeiro encontra e move os arquivos, o segundo só será executado se o primeiro comando for bem sucedido e removerá os diretórios.

Obrigado a Rinzwind por apontar o perigo de nomes de arquivos duplicados, o que me levou a adicionar a opção --backup=numbered usada originalmente por Kos.

    
por Arronical 11.08.2015 / 15:52