gzip todos os arquivos sem excluí-los

11

Eu preciso compactar todos os arquivos em um diretório separadamente, incluindo todos os arquivos nos subdiretórios, sem excluir os originais posteriormente. Então, digamos que eu tenho index.html, quero ter no final index.html.gzip AND index.html.

Sou capaz de compactar todos os arquivos em meu diretório via

gzip -r .

Mas também quero manter os arquivos originais.

Isso é possível?


fonte

Respostas:

9
find . -type f | \
while read -r x
do
  gzip -c "$x" > "$x.gz"
done

O -cempurra o resultado na saída padrão e mantém a sós originais. A desvantagem é que você precisa encontrar os arquivos sozinho. Para um deslocamento mais sofisticado, você pode usar find(1), no entanto, como acima: .pesquisas iniciadas no diretório atual e -type fretornam o nome de todos os arquivos regulares.

Boldewyn
fonte
Por que *.*dentro ls?
@pooh: *.*corresponde a todos os arquivos nomeados regularmente, e geralmente nenhum diretório. Obviamente, ele só funciona na maioria dos casos e geralmente não se você precisar. Então use o findcomando
Boldewyn
@ Boldewyn: a questão era compactar todos os arquivos em um diretório. ls *.*não seleciona arquivos como TODO .
lsnão é necessário em tudo : for x in *. No entanto, o uso finddeve ser find . -type f | while read -r x.
Pausado até novo aviso.
Resposta atualizada. Obrigado pela -rativação read.
Boldewyn
5
find . -type f -not \( -name '*.gz' -or -name '*[~#]' \) -exec sh -c 'gzip -c "{}" > "{}.gz"' \;

Você pode alternar facilmente para incluir o que deseja compactar ( -name '*.txt -or -name '*.htmletc.) em vez de agora, excluindo alguns arquivos (arquivos já compactados, de backup e temporários).

Também manipula espaços no nome do arquivo.

Mude gzippara echo gzippara teste. Ou pule a parte -exec todos juntos.

Edit: Ah, eu esqueci de mencionar que isso não verifica se <target>.gzjá existe. Isso pode ou não ser um problema.

Edit2: Ok, aqui vamos nós com algo que verifica o arquivo existente. Se isso pode ser desejado. Perdoe o on-line-ness.

while read file; do if [ ! -f "$file.gz" ]; then echo "Compressing $file"; gzip -c "$file" > "$file.gz"; else echo "Not overwriting $file.gz";  fi  done < <(find . -type f -not \( -name '*.gz' -or -name '*[~#]' \))

My find-foo talvez não seja o que poderia ser, pode muito bem ser possível pular diretamente na busca.

plundra
fonte
1
basta ler que -name deve vir antes de -type para evitar chamar stat em todos os arquivos.
@ Ben Faz sentido, boa entrada! Para árvores grandes, pode ser perceptível.
Plundra
2

Basta adicionar a opção -c, acho que isso deve funcionar

Ken Wayne VanderLinde
fonte
1
Provavelmente, isso só funciona ao compactar um único arquivo por vez.
its_me 30/03
0
gzip -rc `ls` > archive.gz

Testado no Debian (gzip 1.3.12-6)

tannerli
fonte
Isso cria um arquivo. O OP quer arquivos separados. lsé desnecessário, use *.
Pausado até novo aviso.