Linux gzip vários subdiretórios em arquivos separados?

16

Como eu seria capaz de compactar subdiretórios em arquivos separados?

Exemplo:

directory
 subdir1
 subdir2

Deve criar subdir1 (.tar) .gz e subdir2 (.tar) .gz

EarthMind
fonte

Respostas:

27

Este pequeno script parece ser a melhor opção, considerando seus requisitos:

cd directory
for dir in */
do
  base=$(basename "$dir")
  tar -czf "${base}.tar.gz" "$dir"
done

Ele lida adequadamente com diretórios com espaços em seus nomes.

Juliano
fonte
Ele me fornece esse erro: bash: -c: linha 1: erro de sintaxe: final inesperado de arquivo
EarthMind
@ EarthMind: Funciona bem aqui. Verifique se o script foi copiado corretamente.
Juliano
@ EarthMind: Não tenho certeza de que você tenha explicado bem a pergunta original. Você deseja executar isso novamente e obter novos arquivos .tar.gz enquanto deixa os arquivos .tar.gz anteriores em paz? Tente adicionar "tmstamp = $ (data '+% Y% m% d-% H% M')" e altere $ {base} para $ {base} - $ {tmstamp}.
Freiheit
2
@ EarthMind: se você colocar tudo em uma linha, verifique se há um ponto e vírgula (;) logo antes do comando tar. Caso contrário, a base é passada como uma variável de ambiente para o tar, em vez de ser uma variável auxiliar do shell.
Juliano
@mwojtera sua tentativa de edição deve ser a sua própria resposta
pintos
10

Que tal agora: find * -maxdepth 0 -type d -exec tar czvf {}.tar.gz {} \;

Explicação: Você executa uma localização em todos os itens no diretório atual. A profundidade máxima de 0 não faz com que seja menor do que os argumentos apresentados. (Nesse caso, * ou todos os itens em seu diretório atual) O argumento 'd' para "-type" corresponde apenas aos diretórios. Então exec executa tar em qualquer combinação. ({} é substituído pelo arquivo correspondente)

Christopher Karel
fonte
1
Mas então eu ainda obter o erro que o caminho fornecido é um diretório e não um arquivo
EarthMind
3
sozinho o gzip não arquiva diretórios
Juliano
Você precisa tar os diretórios antes de poder compactá-los.
28909 Dech
1
Você precisa do tar com a opção z, não do gzip direto para diretórios. Uso muito bom de encontrar, no entanto.
Freiheit
3
Erro: "find: caminhos devem preceder a expressão:;" A primeira parte funciona, então eu usei (somente diretórios): for dir in `find * -maxdepth 0 -type d`; do tar -cvzf ${dir}.tar.gz ${dir}; done
JosephK
4

Isso criará um arquivo chamado blah.tar.gz para cada arquivo em um diretório chamado blah.

$ cd directory
$ for dir in `ls`; do tar -cvzf ${dir}.tar.gz ${dir}; done

Se você tiver mais do que simplesmente diretórios no diretório (ou seja, arquivos também, pois ls retornará tudo no diretório), use o seguinte:

$ cd directory
$ for dir in `find . -maxdepth 1 -type d  | grep -v "^\.$" `; do tar -cvzf ${dir}.tar.gz ${dir}; done

O grep -v exclui o diretório atual que será exibido no findcomando por padrão.

Philip Reynolds
fonte
3
Ambos sl e find NÃO foram feitos para serem usados ​​dessa maneira. Especialmente ls, pretende-se apresentar arquivos em uma lista legível pelo usuário, não gerar listas de arquivos como argumentos para 'for'. Basta usarfor dir in *
Juliano
1
Eu tentei a sua primeira sugestão, mas ele não funciona com diretórios contendo espaços em seu nome
EarthMind
Além disso, o primeiro comando também criará um tarball para cada arquivo no diretório.
28909 Dech