私は単にデータをテキストファイルにダンプし、「愚かな」バックアップを作成しながらスペースを節約したいと思います。私のバックアップスクリプトは1日1回実行され、次のようになります。
- バックアップ日にちなんで名前付きディレクトリを作成します。
- 一部のデータをテキストファイルにダンプします
"$name"
。 - ファイルが有効な場合は、gzipで圧縮してください
gzip "$name"
。そうでなければ、rm "$name"
。
今後も同じデータがあった場合は、ファイルを削除する追加の手順を追加したいと思います(そしてシンボリックリンクまたはハードリンクを作成します)。
最初は使用しようとしましたが、md5sum "$name"
ファイル名と作成日も保存するため、機能しません。
gzip
2つのgzipファイルを比較して同じかどうかを知らせるオプションはありますか?そのようなオプションがない場合、gzip
目標を達成するための別の方法はありますか?
ベストアンサー1
@ダクロバート素晴らしい答えですが、私が見つけた追加情報を共有したいと思います。
gzip -l -v
gzip圧縮ファイルにはすでにハッシュが含まれています(安全ではありませんが、この投稿):
$ echo something > foo
$ gzip foo
$ gzip -v -l foo.gz
method crc date time compressed uncompressed ratio uncompressed_name
defla 18b1f736 Feb 8 22:34 34 10 -20.0% foo
CRCと圧縮されていないサイズを組み合わせることで、迅速に指紋を得ることができます。
gzip -v -l foo.gz | awk '{print $2, $7}'
CMP
2バイトが同じであることを確認するには、を使用しますcmp file1 file2
。 gzip圧縮ファイルには、データとフッター(CRC +ソースサイズ)が追加されたヘッダーがあります。これgzip形式の説明表示ヘッダーにはファイルが圧縮された時間が含まれ、ファイル名は10バイトヘッダーに追加されたnullで終わる文字列です。
したがって、ファイル名が変更されずにgzip "$name"
同じコマンド()を使用すると仮定すると、cmp
時間を含む最初のバイトを使用してスキップすると、2つのファイルが異なることを確認できます。
cmp -i 8 file1 file2
ノート:同じ圧縮オプションを想定することが重要です。それ以外の場合、コマンドは常にファイルを別々に報告します。これは、圧縮オプションがヘッダーに格納されて圧縮データに影響を与える可能性があるために発生します。cmp
生バイトだけを見てgzipとして解釈しません。
同じ長さのファイル名がある場合は、ファイル名を読み取った後にスキップするバイト数を計算してみることができます。ファイル名のサイズが異なる場合は、cmp
バイトをスキップして実行できますcmp <(cut -b9- file1) <(cut -b10- file2)
。
ジカプ
これは確かに最良のアプローチです。まず、データを圧縮してバイト比較を開始します(実際にはcmp
()シェルスクリプトで実行されます)。zcmp
zdiff
マンページの次の説明を恐れないでください。
比較する前に両方のファイルを解凍する必要がある場合、2番目のファイルは/ tmpで解凍されます。他のすべての場合、zdiffとzcmpはパイプのみを使用します。
十分に新しいBashがある場合、圧縮は一時ファイルを使用せず、パイプのみを使用します。またはzdiff
ソースによると、
# Reject Solaris 8's buggy /bin/bash 2.03.