Script unix bash verifica arquivos gz vazios [duplicados]

5

Estou tentando escrever um script bash que irá para um loop de diretório através dos arquivos .gz e os excluirá se estiverem vazios (ou seja, o arquivo descompactado contido em vazio.

Eu tenho algumas perguntas:

  • Existe um tamanho de arquivo padrão de um arquivo vazio compactado (gz) que posso verificar?
  • Ou existe uma maneira melhor de verificar se um gz contém um arquivo vazio sem descompactá-lo com um script bash?

Eu estava tentando usar o seguinte código para conseguir isso, mas ele depende do tamanho do arquivo que eu acho.

for f in dir/*
do
    if [[ -s $f ]]
    then
        do_file_creation
    fi
done
    
por van 29.05.2012 / 18:55

5 respostas

6

Infelizmente, o gzip contém o nome do arquivo original, então o seu tamanho irá variar sem diferentes arquivos vazios.

gunzip -c $f | head -c1 | wc -c

fará eco 1 para arquivos que não sejam zero em tamanho não compactado e 0 para arquivos vazios compactados.

for f in dir/*
do
    if [[ $(gunzip -c $f | head -c1 | wc -c) == "0" ]] 
    then
        do_file_creation
    fi
done

Pode fazer o que quiser?

    
por 29.05.2012 / 19:12
3

Você pode adicionar -l a gzip|gunzip|zcat para imprimir informações sobre o arquivo compactado e, em seguida, testar o tamanho do arquivo descompactado.

$ gunzip -l file.empty.gz 
compressed        uncompressed  ratio uncompressed_name
        31                   0   0.0% file.empty
    
por 29.05.2012 / 19:05
1

O nome do arquivo (ou a ausência do nome do arquivo no arquivo compactado) alterará o tamanho dos arquivos para que você não possa procurar um tamanho padrão, por exemplo,

$ touch file1 file2-longer-name file3
$ gzip file1 file2-longer-name
$ gzip --no-name file3
$ ls -l file*.gz
-rw-r--r-- 1 cwarden cwarden 26 May 29 10:33 file1.gz
-rw-r--r-- 1 cwarden cwarden 38 May 29 10:33 file2-longer-name.gz
-rw-r--r-- 1 cwarden cwarden 20 May 29 10:33 file3.gz

Eu provavelmente faria algo assim:

for f in dir/*; do
    zcat $f | head -1 | ifne -n rm -f $f > /dev/null
done
    
por 29.05.2012 / 19:42
0

Provavelmente, existe uma maneira melhor, mas isso deve fornecer o tamanho do arquivo da versão não compactada do arquivo compactado:

export fsize=$(gunzip -l ${f} | tail -1 | awk -F " " '{print $2}' )

    
por 29.05.2012 / 19:14
-1
for i in *.gz
do
     [ 'zcat "$i" | head -n 1 | wc -c ' -eq 0 ] && rm -i "$i"
done

O zcat "$i" | head -n 1 | wc -c contará o número de caracteres na primeira linha do arquivo, o que evita a descompactação de todo o arquivo apenas olhando para o começo dele.

Também adicionei um -i ao comando rm para solicitar uma confirmação antes de excluir o arquivo, mas você pode removê-lo se isso não for necessário no seu caso.

    
por 29.05.2012 / 19:30