You can just do:
gzip *
gzip will tell you it skips the files that already have a .gz
ending.
If that message gets in the way you can use:
gzip -q *
What you tried did not work, because gzip
doesn't read the filenames of the files to compress from stdin, for that to work you would have to use:
ls | grep -v gz | xargs gzip
You will exclude files with the pattern gz
anywhere in the file name, not just at the end.¹ You also have to take note that parsing the output of ls
is dangerous when you have file names with spaces, newlines, etc., are involved.
A more clean solution, not relying on gzip
to skip files with a .gz
ending is, that also handles non-compressed files in subdirectories:
find . -type f ! -name "*.gz" -exec gzip {} \;
¹ As izkata
commented: using .gz
alone to improve this, would not work. You would need to use grep -vF .gz
or grep -v '\.gz$'
. That still leaves the danger of processing ls
' output