Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

I would like to compress a text file using gzip command line tool while keeping the original file. By default running the following command

gzip file.txt

results in modifying this file and renaming it file.txt.gz. instead of this behavior I would like to have this new compressed file in addition to the existing one file.txt. For now I am using the following command to do that

gzip -c file.txt > file.txt.gz

It works but I am wondering why there is no easier solution to do such a common task ? Maybe I missed the option doing that ?

share|improve this question
1  
This is because, gzip compresses the given file and creates new file. Compression means squeezing original file and replacing it with new one. Your "-c" option is explicitly telling gzip to save it with other name. That's why it works –  SHW Aug 31 '12 at 8:52
    
@SHW I didn't get your comment ... ? –  Manuel Selva Aug 31 '12 at 9:07
    
@ManuelSelva once the original file is compressed, it's no longer needed, I guess that was the design. –  warl0ck Aug 31 '12 at 9:58

3 Answers 3

up vote 18 down vote accepted

From the documentation it seems that there is no option to create a copy of the file.

You can define a shell function

gzipkeep() {
    if [ -f "$1" ] ; then
        gzip -c -- "$1" > "$1.gz"
    fi
}

and then

gzipkeep file.txt
share|improve this answer
    
Note that if the file is -, you have to call it as gzipkeep ./-. –  Stéphane Chazelas Jan 7 at 17:13

Alternatively, you can write:

gzip < file > file.gz

When not given any argument, gzip reads its standard input, compresses it and writes the compressed version to its standard output. As a bonus, when using shell redirections, you don't have to worry about files called "--help" or "-" (that latter one still being a problem for gzip -c --).

Another benefit over gzip -c file > file.gz is that if file can't be opened, the command will fail without creating an empty file.gz (or truncating an already existing file.gz) and without running gzip at all.

share|improve this answer
1  
Now this addresses the specifics of the OP's question and answers the general question "How to tell gzip to keep the original file". Very handy and more useful than -c. –  codewaggle Dec 18 '12 at 21:20
    
This should be solution over the accepted answer, as it is less complex and more quickly answers base question. –  djc391 Jul 5 '13 at 1:19

Note that the recently (June 2013) released gzip-1.6 "accepts the --keep (-k) option, for consistency with tools like xz, lzip and bzip2. With this option, gzip no longer removes named input files when compressing or decompressing".

Excerpt from the man page:

  -k --keep
         Keep (don't delete) input files during compression or decompression.

So, as of 1.6, you can use -k or --keep to keep the original file:

gzip -k -- "$file"

(note that it doesn't work if $file is - (which gzip interprets as meaning stdin instead of the actual file called -), in which case, you have to change it to ./-)

share|improve this answer
    
This is amazing!! –  Karel Bílek Jun 14 '13 at 15:31
2  
Geez. RHEL6 only comes with zip 1.3.12 in base... –  Nicholas Tolley Cottrell Jun 25 '13 at 14:36

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.