Como você recurse diretórios, descompacte e mova tudo?

3

Digamos que eu tenha a seguinte árvore de diretórios

.
├── a1
│   └── sub1
│       └── a1.zip
└── a2
    └── sub2
        └── a2.zip

O diretório atual contém os diretórios a1 e a2 . Eu quero pesquisar, localizar e extrair recursivamente todos os arquivos zip e mover tudo para a1 e a2 , respectivamente. O estado do objetivo é:

.
├── a1
│   ├── file1
│   └── file2
└── a2
    ├── file1
    └── file2

Onde os arquivos vieram do zip. Como faço isso? Quais ferramentas devo usar no Terminal para isso?

EDITAR

Para ser mais específico, menciono a recursão, uma vez que não sabemos quantos subdiretórios existem. Pode ser:

.
├── a1
│   └── sub1
│       └── sub...
│                └── a1.zip
│                └── text1.txt
└── a2
    └── sub2
        └── sub...
                 └── a2.zip
                 └── text2.txt

Objetivo:

.
├── a1
│   ├── file1_unzipped
│   └── text1.txt
└── a2
    ├── file1_unzipped
    └── text2.txt
    
por vega 05.10.2017 / 15:53

1 resposta

5

1. Descompacte todos os .zip archives

find . -type f -name "*.zip" -exec unzip {} +

Explicações

  • find . - procura no diretório atual
  • -type f - arquivos
  • -name "*.zip" - cujo nome corresponde a *.zip (assim termina em .zip ),
  • -exec unzip {} + - crie uma longa lista de todas as correspondências e execute unzip

2. Mova todos os arquivos dos níveis mais baixos para um nível abaixo do atual

for i in */; do find "$i" -type f -exec mv {} "$i" \; && rm -r "$i"*/; done

Explicações

  • for i in */; do …; done - percorre todos os diretórios no nível atual
  • find "$i" -type f - procura todos os arquivos no diretório atualmente processado e abaixo
  • -exec mv {} "$i" \; - mova-os para o diretório atualmente processado
  • && faz o seguinte apenas se o comando anterior tiver terminado com sucesso
  • rm -r "$i"*/ - remove todos os subdiretórios no diretório atualmente processado
por dessert 05.10.2017 / 16:02