web-dev-qa-db-ja.com

元のファイルを保持するようにgzipに指示する方法は?

keeping元のファイルを使用しながら、gzipコマンドラインツールを使用してテキストファイルを圧縮したいと思います。デフォルトでは次のコマンドを実行します

gzip file.txt

その結果、このファイルが変更されて名前が変更されますfile.txt.gz。この動作の代わりに、この新しい圧縮ファイルを既存のファイルにadditionで入れたいですfile.txt。今のところ、次のコマンドを使用してそれを実行しています

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

それは機能しますが、なぜそのような一般的なタスクを行うための簡単な解決策がないのでしょうか?多分私はそれをしているオプションを逃しましたか?

221
Manuel Selva

GNU gzip 1.6以降、NetBSDの派生物または最近のバージョンについては、 don_cristiの回答 を参照してください。

どのバージョンでも、次のようにシェルリダイレクトを使用できます。

gzip < file > file.gz

引数を指定しない場合、gzipは標準入力を読み取り、それを圧縮して、圧縮バージョンを標準出力に書き込みます。おまけとして、Shellリダイレクトを使用する場合、"--help"または"-"というファイルについて心配する必要はありません(後者のファイルはgzip -c --でも問題です)。

gzip -c file > file.gzに対するもう1つの利点は、fileを開けない場合、空のfile.gzを作成せずに(または既存のfile.gzを上書きせずに)、実行せずにコマンドが失敗することです。 gzipまったく。

ただし、gzip -kとの大きな違いは、fileのメタデータ(所有権、権限、変更時刻、非圧縮ファイルの名前)をfile.gzにコピーしようとしないことです。

また、file.gzがすでに存在する場合は、シェルでnoclobberオプションを(POSIXシェルでは、たとえばset -o noclobberを使用して)オンにしない限り、暗黙的に上書きされます。

254

最近リリースされた(2013年6月) gzip-1.6 "は、-keep(-k)オプションを受け入れ、xz、lzipなどのツールとの一貫性を保つことに注意してください。およびbzip2。このオプションを使用すると、gzipは圧縮または解凍時に名前付き入力ファイルを削除しなくなりました "

Manページからの抜粋:

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

したがって、1.6以降、-kまたは--keepを使用して元のファイルを保持できます。

gzip -k -- "$file"

$file-である場合は機能しません(gzipstdinと解釈します) -という実際のファイルの代わりに、その場合は./-)に変更する必要があります

そのオプションは bzip2との一貫性を保つために、gzipのFreeBSD実装で最初に導入されました (2007年のFreeBSD 7.0で)でした。そのgzipは、NetBSDによるGNU gzipの書き換えに基づいています。- -kオプションは、最終的に201

149
don_crissti

ドキュメントから、ファイルのコピーを作成するオプションがないようです。

シェル関数を定義できます

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

その後

gzipkeep file.txt
30
Matteo