gzipコマンドラインツールを使用してテキストファイルを圧縮したいです。維持する元のファイル。デフォルトでは、次のコマンドが実行されます。
gzip file.txt
その結果、ファイルが変更され、名前が変更されますfile.txt.gz
。この新しい圧縮ファイルを次の場所に配置したいと思います。次へ追加既存のfile.txt
。これでこれを行うには、次のコマンドを使用しています。
gzip -c file.txt > file.txt.gz
それはうまくいきますが、なぜそれほど一般的な作業のためのより簡単な解決策がないのだろうか。たぶん私はこれを行うオプションを逃したのでしょうか?
答え1
GNU gzip
1.6以降、FreeBSD、およびその派生製品、または最新バージョンのNetBSDについては、以下を参照してください。ドンクリスティの答え。
どのバージョンでも、次のようにシェルリダイレクトを使用できます。
gzip < file.txt > file.txt.gz
引数が指定されていない場合は、標準入力が読み取らgzip
れ圧縮され、圧縮されたバージョンが標準出力に書き込まれます。追加ボーナスとして、シェルリダイレクトを使用するときに"--help"
名前またはファイルを心配する必要はありません"-"
(後者はまだ問題ですgzip -c --
)。
もう1つの利点gzip -c file.txt > file.txt.gz
は、開けない場合は空のコマンドを作成せず(または既存のコマンドを上書きせずに)、file.txt
コマンドが失敗してまったく実行されないことです。file.txt.gz
file.txt.gz
gzip
これと比較して1つの重要な違いgzip -k
はfile.txt
、メタデータ(所有権、権限、変更時間、圧縮されていないファイル名)ですfile.txt.gz
。
また、すでに存在する場合は、シェル(POSIXシェルなど)でオプションを設定しfile.txt.gz
ない限り、自動的に上書きされます。noclobber
set -o noclobber
答え2
最新(2013年6月)gzip-1.6
「xz、lzip、bzip2などのツールとの整合性のために--keep(-k)オプションを許可します。このオプションを使用すると、gzipは圧縮または解凍時に指定された入力ファイルを削除しません。」。
マニュアルページから抜粋:
-k --keep Keep (don't delete) input files during compression or decompression.
したがって、最初から元のファイルを使用または維持1.6
できます。-k
--keep
gzip -k -- "$file"
$file
-
((gzip
意味として解釈された場合は機能しません。)標準入力)という実際のファイルの代わりに)-
に変更する必要があります。./-
そのオプションはFreeBSD実装に初めて導入されましたgzip
(2007年のFreeBSD 7.0では)bzip2
これはgzip
NetBSDに基づいてGNUを書き換えたものですgzip
。これ-k
このオプションは最終的に2010年にNetBSDに返されました。。
答え3
文書によると、ファイルのコピーを作成するオプションがないようです。
シェル関数を定義できます。
gzipkeep() {
if [ -f "$1" ] ; then
gzip -c -- "$1" > "$1.gz"
fi
}
それから
gzipkeep file.txt
答え4
@Matteoの答えに基づいて、フラグがgzipkeep
ないシステムで複数のファイルを一度に処理するgzipの機能を維持しながら、コードをforループにまとめてワイルドカードを処理することができます-k
(そうでなければforの大きな利点です-k
)。また、試行された各ファイルの状態を表示できるように冗長にしました。
gzipkeep() {
for file in "$@"; do
if [ -f "$file" ] ; then
gzip -cv9 -- "$file" > "$file.gz"
fi
done
}
次に、ワイルドカードを使用して実行します。たとえば、
gzipkeep images/*.svg