Como zipar muitos subdiretórios de n-ésimo níveis, sem o diretório top (pai)?

2

em tal estrutura de sistema de arquivos:

root/
    |
    container1/
    |         |
    |         subdir2/
    |                |
    |                subdir3/
    |                       |
    |                       subdir4/
    |                              |
    |                              file1
    |                              file2
    |                              subdir5/
    container2/
              |...

Preciso zipar tudo:

  • em '/ subdir4 /' '
  • sem o /subdir4/ em si
  • em todos os potenciais /container/ subdirs do diretório root/
  • nomeie o zip da mesma pasta pai do conteúdo que está sendo compactado (nesse caso, seria "subdir4.zip")

Por favor, tenha em mente:

  • estes não são os nomes reais de dirs e subdiretórios, é apenas uma aproximação
  • Estou usando o ZSH em um Mac OSX
  • Eu sou muito novo no script Unix / Linux

Eu realmente gostaria de um tipo de solução loop-agnostic, simple, loop, para que eu possa aprender tanto quanto possível e ser flexível na modificação desta solução para outros casos potenciais.

Aqui está o que tentei até agora , como sugerido por amigos:

find . -mindepth 5 -maxdepth 5 -type d -exec sh -c '
pushd "$0/..";zip -rFS "$(basename "$0").zip" "$(basename "$0")";popd ' {} \;

Nesse meio tempo, aprendi que essa solução tem as seguintes desvantagens:

  • $ 0 não deve ser usado como parâmetro posicional porque é usado no relatório de erros e / ou como o nome do script de shell (no meu caso, é apenas uma string)
  • basename e dirname devem ser evitados se usar o bash (leia mais aqui )
  • essa sintaxe, com ... {} \; , invoca tantas shells quantas forem os resultados, supostamente não é maneira eficiente de fazer esse tipo de operação

Eu deveria estar usando:

  • $ 1 em meus parâmetros posicionais
  • ... ;popd ' sh {} +

Esse deve obter todos os resultados em uma espécie de "array / list" e aplicar os comandos dentro da string passada ao sh all de uma vez.

Obrigado!

PONTOS BONIFICADOS: :)

  • posso nomear o arquivo .zip resultante como /subdir3/ em vez de /subdir4/ dessa hierarquia?
por Alex Starbuck 01.09.2016 / 10:09

1 resposta

0

Você pode usar o awk para criar o comando do sistema para executar

find * -mindepth 5 -maxdepth 5 -type d  | awk -F"/" '{system( "cd "$0"; zip -rF "$NF".zip *")}'

O -F divide a linha em /, $0 representa a linha completa e $NF tem seu nome de diretório real. Não há popd necessário, pois o comando do sistema é executado em seu próprio shell e o shell pai permanece no diretório de trabalho atual.

    
por 01.09.2016 / 10:36