Compactar todos os arquivos em um diretório em seu próprio arquivo compactado


24

Como compactar todos os arquivos em um diretório em seu próprio tar, preservando o nome de cada arquivo?

ou seja, file1.out file2.out

->

file1.out.tar.gz file2.out.tar.gz

Respostas:


64

Colocar cada arquivo em um arquivo tar separado não faz sentido nesse cenário. Você pode usar gzippara compactá-los diretamente:

gzip *

resultará em file1.out.gz, file2.out.gzetc.

Você usaria tarapenas se precisasse de um arquivo compactado como um único arquivo.

Se você precisar de um arquivo tar para cada arquivo, você pode criá-lo assim:

for i in *; do tar -czf $i.tar.gz $i; done

7
+1 - Não há motivo para criar um tar (Tape ARchive) para um único arquivo. Apenas comprima o que deseja compactar - o resultado será um pouco menor e fará muito mais sentido para as pessoas que extraem os arquivos.
voretaq7

Para tar cada subdiretório individual (com apenas um nível de profundidade) e remova o original:find . -maxdepth 1 -type d ! -path . | while read a_dir; do tar -zcvf ${a_dir}.tgz ${a_dir} --remove-files; done
xb.

(não é possível editar meu comentário acima após 5 minutos) Uma versão mais simples / segura:find . -maxdepth 1 -mindepth 1 -type d -exec tar -zcvf {}.tgz {} --remove-files \;
xb.

9

Para desenvolver a resposta do @ SvenW (que funcionará apenas no diretório atual), se você tiver um número ENORME de arquivos ou quiser fazê-lo em uma estrutura de diretórios recursiva, também poderá usar

find . -type f -exec gzip \{\} \;

e se você precisar colocar a saída em um diretório diferente (neste exemplo ../target) e não quiser remover os originais, faça algo como:

find . -type f -print | while read fname ; do
    mkdir -p "../target/`dirname \"$fname\"`"
    gzip -c "$fname" > "../target/$fname.gz"
done

1
find . -type f -exec gzip {} \;será suficiente. O segundo código falhará com nomes de arquivos que contenham espaços e similares.
usuário desconhecido

Algumas conchas não gostam de nada, e a segunda faz algo marcadamente diferente da primeira (e eu estava ciente dos problemas de espaçamento, mas isso é meio complicado de lidar).
macio

Se você conhece esse shell, convido você a responder minha pergunta aqui: unix.stackexchange.com/questions/8647/… . Ninguém foi capaz de nomear algo que hoje está em uso até agora. Se você está ciente do risco de sua resposta, pode ser uma boa ideia nomeá-la em sua resposta.
usuário desconhecido

@userunknown Fui criado no (t) csh, que teve muitos problemas com suspensórios sem escape de uma só vez, embora isso não pareça mais (mas eu ainda escapei {}por força do hábito). Outros já as publicaram como respostas à sua pergunta, no entanto.
macio

Ou, para compactar todos os arquivos não binários:find . -type f -exec grep -Iq . {} \; -and -exec gzip {} \;
xb.

0

Tente este:

#!/bin/bash
for fich in *; do
    if [ "$fich" != "*" ] ; then
        gzip -9 -c $fich > $fich.tar.gz
        \mv $fich.tar.gz $fich
    fi
done
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.