Non c'è bisogno di loop o altro che find e gzip :
find . -type f ! -name '*.gz' -exec gzip "{}" \;
Questo trova tutti i file regolari dentro e sotto la directory corrente i cui nomi non terminano con .gz estensione (ovvero tutti i file che non sono già compressi). Invoca gzip su ciascun file individualmente.
Modifica, basata sul commento di user unknown :
Le parentesi graffe ({} ) vengono sostituiti con il nome del file, che viene passato direttamente, come una singola parola, al comando che segue -exec come puoi vedere qui:
$ touch foo
$ touch "bar baz"
$ touch xyzzy
$ find . -exec echo {} \;
./foo
./bar baz
./xyzzy
find . -type f | while read file; do gzip "$file"; done
Preferirei gzip -r ./ che fa la stessa cosa ma è più breve.