Shell Script para arquivos GZIP sem sobrescrever arquivos .gz

2

Estou tentando criar um script de shell que receba como primeiro parâmetro de um caminho para uma pasta que eu gostaria de compactar todos os arquivos usando gzip sem sobrescrever os arquivos .gz que já existem nesta pasta. / p>

Não sei por qual motivo esse script não está funcionando corretamente:

#!/bin/bash
FOLDER=$1

cd $FOLDER
for f in *.*; do
  if [ ! -f "$f.gz" ]; then
    echo "Compressing $f file..";
    gzip $f
  else
    echo "Not overwriting $f.gz";
  fi
done

Às vezes fica confuso se o arquivo é um arquivo .gz e não o compacta.

    
por Valter Silva 20.02.2013 / 13:42

1 resposta

2

Seus critérios estão errados. *.* retornará todos os arquivos com extensões. Por exemplo, foo.gz . Agora você está verificando o seguinte, no pseudocódigo:

if [ foo.gz.gz does not exist ]
    compress foo.gz to foo.gz.gz
else
    don't overwrite foo.gz.gz

Assim, seu comando de teste irá sempre se ramificar para compactar algo porque o teste sempre será avaliado como verdadeiro. No final, você sempre substituirá seus arquivos, porque "$f.gz" expandirá para foo.gz.gz .

Se o seu requisito real é combinar tudo, menos .gz arquivos em seu diretório atual, o Bash tem maneiras mais fáceis de fazer isso, por exemplo, usando a opção extglob e negação.

#!/bin/bash
FOLDER=$1

shopt -s extglob

cd "$FOLDER"
for f in !(*.gz); do
  if [[ ! -d "$f" ]]; then
    gzip "$f"
  fi
done

Você pode incluir uma verificação para saber se o nome do arquivo retornado não é realmente um diretório - a menos que você queira compactar diretórios também.

Mas, na verdade, o Linux oferece melhores ferramentas para encontrar arquivos que correspondam a determinados critérios. Para (recursivamente) encontrar todos os arquivos que não terminam com .gz e compactá-los:

find /some/where -type f ! -iname '*.gz' -exec gzip '{}' \;

Se você não quiser recursão:

find /some/where -type f -maxdepth 1 ! -iname '*.gz' -exec gzip '{}' \;
    
por 20.02.2013 / 13:56