keeping元のファイルを使用しながら、gzipコマンドラインツールを使用してテキストファイルを圧縮したいと思います。デフォルトでは次のコマンドを実行します
gzip file.txt
その結果、このファイルが変更されて名前が変更されますfile.txt.gz
。この動作の代わりに、この新しい圧縮ファイルを既存のファイルにadditionで入れたいですfile.txt
。今のところ、次のコマンドを使用してそれを実行しています
gzip -c file.txt > file.txt.gz
それは機能しますが、なぜそのような一般的なタスクを行うための簡単な解決策がないのでしょうか?多分私はそれをしているオプションを逃しましたか?
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
を使用して)オンにしない限り、暗黙的に上書きされます。
最近リリースされた(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
が-
である場合は機能しません(gzip
はstdinと解釈します) -
という実際のファイルの代わりに、その場合は./-
)に変更する必要があります
そのオプションは bzip2
との一貫性を保つために、gzip
のFreeBSD実装で最初に導入されました (2007年のFreeBSD 7.0で)でした。そのgzip
は、NetBSDによるGNU gzip
の書き換えに基づいています。- -k
オプションは、最終的に201 。
ドキュメントから、ファイルのコピーを作成するオプションがないようです。
シェル関数を定義できます
gzipkeep() {
if [ -f "$1" ] ; then
gzip -c -- "$1" > "$1.gz"
fi
}
その後
gzipkeep file.txt