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 .gz
archivos en su directorio actual, Bash tiene formas más fáciles de hacerlo, por ejemplo, utilizando la extglob
opció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 .gz
y 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 '{}' \;
cd "$FOLDER"
ygzip "$f"
.