How to gzip all files in all sub-directories in bash

71,160

Solution 1

No need for loops or anything more than find and gzip:

find . -type f ! -name '*.gz' -exec gzip "{}" \;

This finds all regular files in and below the current directory whose names don't end with the .gz extension (that is, all files that are not already compressed). It invokes gzip on each file individually.


Edit, based on comment from user unknown:

The curly braces ({}) are replaced with the filename, which is passed directly, as a single word, to the command following -exec as you can see here:

$ touch foo
$ touch "bar baz"
$ touch xyzzy
$ find . -exec echo {} \;

./foo
./bar baz
./xyzzy

Solution 2

I'd prefer gzip -r ./ which does the same thing but is shorter.

Solution 3

find . -type f | while read file; do gzip "$file"; done
Share:
71,160
Farshid
Author by

Farshid

Updated on July 29, 2022

Comments

  • Farshid
    Farshid almost 2 years

    I want to iterate among sub directories of my current location and gzip each file seperately. For zipping files in a directory, I use

    for file in *; do gzip "$file"; done
    

    but this can just work on current directory and not the sub directories of the current directory. How can I rewrite the above statements so that It also zips the files in all subdirectories?