
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 ~/photos
que 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.