LoginSignup
0
0

展開したファイルが正しくコピーされているか確認する

Posted at

SEをやっていてsshみたいなのは全然使えず手でSVNからダウンロード、手作業でリリースみたいなことは普通にあったりします。
それ自体は仕方ないなと思うのですが、あちこちにファイルを置く場合、本当にリリースできたか心配なことが多いです。
そういうことを少しでも減らす方法がないか調べてみました。

md5sumの--checkオプションでファイルチェックを行う

例えばvimのダウンロードページに行くとダウンロードディレクトリ配下にMD5SUMというファイルが用意されています。
https://ftp.nluug.nl/pub/vim/unix/MD5SUMS

このファイルをダウンロードしてLinuxなどにインストールされている md5sum--check というオプションを使うとこんな感じで出力されます。
※下記の例では vim-8.1.tar.bz2は空ファイル、 vim-8.2.tar.bz2` は正しくダウンロードしたファイルです

% md5sum -c MD5SUMS
(略)
md5sum: vim-8.0.tar.bz2: No such file or directory
vim-8.0.tar.bz2: FAILED open or read
vim-8.1.tar.bz2: FAILED
vim-8.2.tar.bz2: OK
md5sum: WARNING: 62 listed files could not be read
  • 存在しないvim-8.0.tar.bz2 → 開けなかったメッセージ(FAILED open or read)
  • ダミー用に作った空ファイルのvim-8.1.tar.bz2 → FAIL
  • ちゃんとダウンロードした vim-8.2.tar.bz2 → OK

となっています。

md5sumの--checkオプションで使えるフォーマット

MD5SUMSというファイルの中身は単純で各行が下記のようにハッシュ値、ファイル名が並べられています。ちなみに試しに絶対パスでやっても上手く動きました。

6bf455c878d536f3957f0bc89cca539e  README
(略)
2f3e6ab74d20eea2dc00cedc3f0ee4e8  vim-8.2.tar.bz2

このフォーマットは md5sum コマンドの出力であり、マニュアルによると下記のフォーマットになっています。

各入力 FILE に対する出力フォーマットは、 MD5 sum 値・スペース・ファイルタイプを示す文字 (バイナリなら `*'、テキストなら ` ')・ファイル名、からなる。 --check は入力がこのフォーマットであるものとみなす。
md5sum - コマンド (プログラム) の説明 - Linux コマンド集 一覧表

テキストの場合、空白1文字です。

ちなみに、このフォーマットいくつか流儀があるらしくGNUの cksum コマンドによるとMD5SUMは Untagged output formatらしく、他に

  • Legacy output format
    CRC、バイト数、ファイル名の順
    (例: 4012370823 3345 MD5SUMS)
  • Tagged output format
    ハッシュ方法 (ファイル名) = ハッシュ値
    例: ( MD5 (MD5SUMS) = 3cf87c0a65d4fc00bc091627c9850617 )
    cksum output modes

の方法があるようです。さらにsigファイルのように署名を検証するツールがありますが、ここでは扱いません。
https://www.gnupg.org/gph/en/manual/x135.html
https://ac-as.net/verification-of-gpg-signature/

SEの手ファイル展開に使用する

上記のmd5sumを使う方法はLinuxなどmd5sumコマンドが使える環境でのみ有効です。ダウンロードしてきて使っても良いのですが、客先で使わせてーっていうのが面倒な方は下記にこんな感じってPowerShellを残しておきます。
Windows11のPowershell5で確認しましたが、10でも大丈夫だと思います。

# ハッシュ値とファイル名一覧が書かれたファイルを指定
$hashfile = Get-ItemChild "(MD5ファイル)"
# 一覧が書かれたファイルのフォルダへ移動
pushd $hashfile.Directory

# ファイルを開く
get-content $hashfile `
| %{ $hash, $filename = $_ -split "  ", 2  # スペース2つで分割、ただし作成後の配列は2つだけにする
    if (Test-Path $filename) {  # ファイルが存在したら
        if ((Get-FileHash -Algorithm MD5 $filename).Hash -eq $hash) {  # MD5でハッシュ値をとり一覧の中にあったハッシュ値と比較
            echo ("OK:   " + $filename)
        } else {
            echo ("NG:   " + $filename)
        }
    } else {
        echo ("Lost: " + $filename)  # 存在しなかったらLostと表示
    }
}
# 移動まえに戻る
popd

チェック用のファイルを作成する

md5sum --check に使うファイルは、リリース前に展開するフォルダに対して find . -type f -exec md5sum {} \; とすれば作成できます。
一応、Powershellは下記みたいな感じになるかと。

# 事前に一覧をとるフォルダに移動してください
# ファイル一覧を取得
# ファイルハッシュを取得、その後にスペース2文字をくっつけ
# ファイルパスを出力。このとき、相対パスにし、先頭の.\は削除、パスの区切りの\も/に変更する
dir -File -Recurse
| %{ ( `
    (Get-FileHash -Algorithm MD5 $_.FullName).Hash `
    + "  " `
    + ((Resolve-Path -Relative $_.FullName) -replace "^\.\\", "").Replace("\", "/") `
)}

参考:
md5sumコマンドについて詳しくまとめました 【Linuxコマンド集】

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0