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 gzip
sin sobrescribir los .gz
archivos 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 .gz
archivo y no lo comprime.
linux
shell
shell-script
compression
gzip
Valter Silva
fuente
fuente
cd "$FOLDER"
ygzip "$f"
.Respuestas:
Tus criterios son incorrectos.
*.*
devolverá todos los archivos con extensiones. Por ejemplo,foo.gz
. Ahora está comprobando lo siguiente, en pseudocódigo: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á afoo.gz.gz
.Si su requisito real es hacer coincidir todo menos los
.gz
archivos en su directorio actual, Bash tiene formas más fáciles de hacerlo, por ejemplo, utilizando laextglob
opción y la negación.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
.gz
y comprimirlos:Si no quieres recurrencia:
fuente
gzip
solo sale con ungzip: test.gz already has .gz suffix -- unchanged
estado 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 unaecho
declaración en el primerfind
ejemplo.)