massa descompacta arquivos gzip sem extensão gz

7

Eu tenho um grande número de arquivos com extensões como .0_1234 .0_4213 e .0_4132 etc. Alguns deles são gzip compactados e alguns são e-mails brutos. Eu preciso determinar quais são os arquivos compactados, descompactá-los e renomear todos os arquivos para uma extensão comum, uma vez que todos os arquivos compactados são descompactados. Descobri que posso usar o comando file para determinar quais são compactados, depois grep os resultados e usar sed para reduzir a saída a uma lista de arquivos, mas não posso determinar como descompactar as extensões aparentemente aleatórias. Aqui está o que eu tenho até agora

file *|grep gzip| sed -e 's/: .*$//g'

Gostaria de usar xargs ou algo assim para obter a lista de arquivos fornecidos na saída e renomeá-los para .gz para que possam ser descompactados ou simplesmente descompactá-los na linha.

    
por Nicholas Aplington-Johnson 22.12.2016 / 17:39

3 respostas

5

Não use gzip , use zcat em vez de esperar uma extensão. Você pode fazer tudo de uma só vez. Apenas tente zcat do arquivo e, se isso falhar porque não está compactado, cat em vez disso:

for f in *; do 
    ( zcat "$f" || cat "$f" ) > temp && 
    mv temp "$f".ext && 
    rm "$f" 
done

O script acima tentará primeiro zcat do arquivo em temp e, se isso falhar (se o arquivo não estiver no formato gzip), será apenas cat . Isso é executado em um subshell para capturar a saída de qualquer comando executado e redirecioná-lo para um arquivo temporário ( temp ). Em seguida, o temp é renomeado para o nome do arquivo original mais uma extensão ( .ext neste exemplo) e o original é excluído.

    
por 22.12.2016 / 17:53
4

Você poderia fazer algo como

for f in ./*
do 
gzip -cdfq "$f" > "${f}".some_ext
done

Isso processa todos os arquivos (mesmo os não compactados, via -f ) e grava (via -c ) a saída para stdout usando o redirecionamento para salvar o conteúdo de cada arquivo em seu .some_ext de contrapartida. Você poderia então remover os originais, por exemplo com bash

shopt extglob
rm -f ./!(*.some_ext)

ou zsh

setopt extendedglob
rm -f ./^*some_ext

Você pode até salvar os arquivos resultantes em outro diretório (desta vez supondo que você queira remover a extensão original), por exemplo,

for f in *
do 
gzip -cdfq -- "$f" > /some/place/else/"${f%.*}".some_ext
done

e, em seguida, remova tudo no diretório atual ...

    
por 22.12.2016 / 19:09
3

Isto irá apresentar uma lista de todos os arquivos compactados com gzip:

file /path/to/files | grep ': gzip compressed data' | cut -d: -f1

Para adicionar uma extensão .gz em todos os arquivos compactados, esse truque feio pode funcionar:

for file in ./*; do
    if gzip -l "$file" > /dev/null 2>&1; then
        case "$file" in
          *.gz) :;; # The file already has the extension corresponding to its format
          *) mv "$file" "${file}.gz";;
        esac
        # Uncomment the following line to decompress them at the same time
        # gunzip "${file}.gz"
    fi
done
    
por 22.12.2016 / 17:46