元のファイルを保持するようにgzipにどのように通知できますか?

元のファイルを保持するようにgzipにどのように通知できますか?

gzipコマンドラインツールを使用してテキストファイルを圧縮したいです。維持する元のファイル。デフォルトでは、次のコマンドが実行されます。

gzip file.txt

その結果、ファイルが変更され、名前が変更されますfile.txt.gz。この新しい圧縮ファイルを次の場所に配置したいと思います。次へ追加既存のfile.txt。これでこれを行うには、次のコマンドを使用しています。

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

それはうまくいきますが、なぜそれほど一般的な作業のためのより簡単な解決策がないのだろうか。たぶん私はこれを行うオプションを逃したのでしょうか?

答え1

GNU gzip1.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.gzfile.txt.gzgzip

これと比較して1つの重要な違いgzip -kfile.txt、メタデータ(所有権、権限、変更時間、圧縮されていないファイル名)ですfile.txt.gz

また、すでに存在する場合は、シェル(POSIXシェルなど)でオプションを設定しfile.txt.gzない限り、自動的に上書きされます。noclobberset -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これはgzipNetBSDに基づいて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

関連情報