-
前回の最後では、
zstdにはzstddiffコマンドが用意されていない
という致命的な欠点について触れた所で終わりました。- 今回のテーマは
zstddiffをどうするかについてです。
- 今回のテーマは
その前に
- 前回の記事を書いた後、Qiita には既に多くの方が
zstdについて書かれていることが分かりました。-
Recommended by LOGLYが紹介してくれた Qiita の記事-
Z の名を冠した圧縮形式 Zstandard の基本的な使い方
-
辞書を作成することで、更に圧縮率を高める
のがそもそもzstdの特徴なんですね!
-
辞書を作成することで、更に圧縮率を高める
-
ログを gzip で圧縮しているなら zstd を導入しよう
-
デコードは拡張子を見て自動で
gzipとzstdを切り替えてくれる
らしいです。これは便利!
-
デコードは拡張子を見て自動で
-
Z の名を冠した圧縮形式 Zstandard の基本的な使い方
- 私がその存在に気付いてなかっただけなので、そらそうですよね ('A`)
-
どうする zstddiff ?
- さて本題ですが、そもそもこの内容は AI さんが教えてくれたので、
記事にするほどのことでも無いですがご容赦ください。まあそれは Qiita の記事全般に言えることかもしれませんが
TL;DR
-
diffコマンドは stdin を-で扱えるので、
zstdcatを使うことで以下のように差分を比較できます。$ FILE=hello.txt; zstdcat ${FILE}.zst | diff -NEwur - $FILE--- - 2025-12-21 16:48:45.198007003 +0900 +++ hello.txt 2025-12-21 16:48:35.008024901 +0900 @@ -0,0 +1 @@ +Hello- めでたし x2
- めでたし x2
もうちっとだけ続くんじゃ
パイプを使うのは何か落ち着かない
-
以下のように
<()を用いることで同じ動作になりますFILE=hello.txt; diff -NEwur <(zstdcat ${FILE}.zst) $FILE
やっぱり zstddiff が良い
-
file が
*.zstの時だけ diff にzstdcatを使うことを意識するのも
何か微妙なので、zstddiffを script で作りたいと思います。$ cat ~/bin/zstddiff#!/bin/bash if [ $# -lt 2 ] then echo "[USAGE] ${0##*/} [zst path] [txt path]" exit 1 fi diff -NEwur <(zstdcat "$1") "$2"
*.zst の方が新しい場合は?
-
zstdcatは*.txtも表示できるので以下で OK です。diff -NEwur <(zstdcat "$1") <(zstdcat "$2")
*.zst じゃないのが来たら?
-
チッうっせーな -
こんな感じでどうでしょうか。
#!/bin/bash show_usage () { echo "[USAGE] ${0##*/} [zst|txt path 1] [zst|txt path 2]" return 1 } zstddiff () { if [[ ! "$1" =~ \.zst$ ]] && [[ ! "$2" =~ \.zst$ ]] then show_usage exit $? fi diff -NEwur <(zstdcat "$1") <(zstdcat "$2") } if [ $# -lt 2 ] then show_usage exit $? fi zstddiff $@
せっかく *.gz も扱えるのに *.gz と *.txt でできないんだけど?
- もうええわ!
- ありがとうございましたー
- ありがとうございましたー
Epilogue
-
他にも何か不具合がありましたらご容赦ください。
-
なお
zdiffやxzdiffも script なので、ご興味があればどうぞ。$ file $(which zdiff) /usr/bin/zdiff: POSIX shell script, ASCII text executable $ cat $(which zdiff) | less$ file $(which xzdiff) /usr/bin/xzdiff: POSIX shell script, ASCII text executable $ cat $(which xzdiff) | less