Script Bash para percorrer pastas, descompactar e mover arquivos para um diretório acima

Script Bash para percorrer pastas, descompactar e mover arquivos para um diretório acima

Eu tenho um grupo de pastas que contém arquivos zip que podem conter 1 ou 2 arquivos, cada um em uma nova pasta. (veja o diagrama abaixo)

Quero apontar o script para o diretório de nível superior e fazer com que ele passe por cada subdiretório, extraia o conteúdo do zip, mova o conteúdo desse subdiretório um nível acima (a exclusão do arquivo compactado original é opcional).

--before--
Photos
-2018
--jan.zip
[--jan1     ]--\
[---jan1.pdf]---}-contents of Zipped file
[---jan1.JPG]--/
--feb.zip
[--feb1     ]--\
[---feb1.pdf]---}-contents of Zipped file
[---feb1.JPG]--/
...

--after--
Photos
-2018
--jan1.pdf
--jan1.JPG
--feb1.pdf
--feb1.JPG

Responder1

Antes de executar qualquer um dos itens a seguir, faça uma cópia (recursiva) do seu diretório de nível superior - apenas por segurança.

Do que você pode conseguir o que deseja assim:

Faça do diretório de nível superior (fotos) seu diretório de trabalho atual. Em seguida, extraia todos os arquivos zip:

find . -iname "*.zip" -execdir unzip {} \;

Agora mova o conteúdo dos diretórios extraídos um nível acima:

find . -type f ! -iname "*.zip" -execdir mv "$(basename {})" .. \;

Isso não afetará os arquivos zip nem os próprios diretórios extraídos, que ficam vazios nesta etapa. Então você pode excluí-los agora:

find . -mindepth 2 -maxdepth 2 -type d -delete

Antes de excluir os arquivos zip, verifique se está tudo bem. Então você pode fazer a exclusão com

find . -iname "*.zip" -delete

A princípio você pode combinar esses comandos em um script, mas sugiro testá-los primeiro, um por um, verificando o resultado após cada etapa.

Um script que usa seu diretório de nível superior como único argumento pode ter a seguinte aparência:

#!/bin/bash
cd "$1"
find . -iname "*.zip" -execdir unzip {} \;
find . -type f ! -iname "*.zip" -execdir mv "$(basename {})" .. \;
find . -mindepth 2 -maxdepth 2 -type d -delete
find . -iname "*.zip" -delete

Se você der a ele o nome "extrair" (e definir a permissão de execução), ele poderá ser usado em seu próprio diretório como este (assumindo ~/photosque seja seu diretório de nível superior):

./extract ~/photos

Mas cuidado: este script nunca foi testado. Ele também não faz testes por conta própria. Depende exatamente do diretório e da estrutura do arquivo zip que você descreve. Então, por favor, faça cópias e testes.

informação relacionada