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?

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.


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.


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



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.