Shell Script para archivos GZIP sin sobrescribir archivos .gz


2

Estoy tratando de crear un script de shell que reciba como primer parámetro de una ruta a una carpeta que me gustaría comprimir todos los archivos usando gzipsin sobrescribir los .gzarchivos que ya existen en esta carpeta.

No sé por qué razón este script no funciona correctamente:

#!/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

A veces se confunde si el archivo es un .gzarchivo y no lo comprime.


Pequeña nota: se necesita una cita para manejar espacios y otros caracteres especiales en los nombres de archivo, es decir, cd "$FOLDER"y gzip "$f".
Daniel Andersson

Respuestas:


2

Tus criterios son incorrectos. *.*devolverá todos los archivos con extensiones. Por ejemplo, foo.gz. Ahora está comprobando lo siguiente, en pseudocódigo:

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

Por lo tanto, su comando de prueba siempre se ramificará para comprimir algo porque la prueba siempre se evaluará como verdadera. Al final, siempre sobrescribirá sus archivos, porque "$f.gz"se expandirá a foo.gz.gz.


Si su requisito real es hacer coincidir todo menos los .gzarchivos en su directorio actual, Bash tiene formas más fáciles de hacerlo, por ejemplo, utilizando la extglobopción y la negación.

#!/bin/bash
FOLDER=$1

shopt -s extglob

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

Puede incluir una comprobación de si el nombre del archivo devuelto no es realmente un directorio, a menos que también desee comprimir directorios.


Pero en realidad, Linux le brinda mejores herramientas para encontrar archivos que coincidan con ciertos criterios. Para (recursivamente) encontrar todos los archivos que no terminan .gzy comprimirlos:

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

Si no quieres recurrencia:

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

En realidad, gzipsolo sale con un gzip: test.gz already has .gz suffix -- unchangedestado 0 cuando se ejecuta en archivos que ya tienen la extensión. Pero, sin embargo, es una coincidencia innecesaria, como usted dice, y la [ ! -f ]prueba en la pregunta también haría cosas inesperadas si hubiera un subdirectorio con un punto que coincidiera con el globo. (Has dejado una echodeclaración en el primer findejemplo.)
Daniel Andersson
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.