uploads以下の通常ファイルをfindで列挙し、各ファイルをsha256sumへ引数として渡す。
ファイル名には空白や引用符が含まれる可能性がある。GNU findとGNU xargsを使用する。
ファイル名の境界を壊さずに渡すコマンドはどれか。
Unixのファイル名には空白や改行を含められる。find -print0とxargs -0を組み合わせると、NUL文字を境界としてパスを安全に受け渡せる。
詳細解説
find uploads -type f -print | xargs sha256sum改行出力を通常のxargsへ渡すと、空白や引用符が区切りとして再解釈される。
誤りです。findの-printは見た目上1パス1行でも、通常のxargsは空白類を区切りとして読みます。
report one.txtは複数の引数へ分割され、存在しないファイルとして扱われます。
find uploads -type f -print | sha256sumファイル本体ではなく、findが出力したパス文字列そのものを標準入力としてハッシュ化する。
誤りです。sha256sumは引数を受け取らず、findの標準出力をデータ本体として読みます。
得られるのはファイル内容ではなく、パス一覧文字列のハッシュ1つです。
find uploads -type f -print0 | xargs -0 sha256sumNUL文字でパスを区切り、xargs -0が同じ境界規則で引数へ戻す。
正しい選択肢です。-print0が各パスの末尾へNULを置きます。
xargs -0がNULだけを境界とするため、空白や引用符もファイル名の一部として保持されます。
find uploads -type f -print | xargs sha256sum '{}'{}は通常のxargsでは置換記号にならず、空白による分割問題も解消しない。
誤りです。通常のxargsでは{}を自動置換しません。
空白区切りも既定のままなので、特殊なファイル名を安全に扱えません。
実際に確かめる
一時的な検証環境で実行できる例です。
mkdir -p uploads
printf alpha > 'uploads/report one.txt'
printf beta > 'uploads/report two.txt'
find uploads -type f -print0 | xargs -0 sha256sum期待される結果
2行のハッシュ値と、次の2つのパスがそれぞれ1引数として表示される
uploads/report one.txt
uploads/report two.txt理解のポイント
- 通常のxargsは空白を区切りとして扱う
- NULはファイル名に含められない
- -print0と-0は対で使用する
確認時の注意
- 確認環境: GNU findutils 4.9以降 / GNU coreutils
- 検証用ファイルだけを読み取り、内容は変更しません。
- ハッシュ値は内容から決まりますが、ここではパスが2つ正しく表示される点を確認します。
基礎のおさらい
ファイル名に使える文字
Unix系ではスラッシュとNUL以外の多くの文字をファイル名に含められます。空白や改行を区切りにすると曖昧になります。
NUL区切り
NULはファイル名に含められないため、曖昧さのない境界として使えます。出力と入力の両側をNUL対応にします。
別の安全な方法
find -exec command {} +も、パスを文字列へ変換して再解析せず引数として渡せます。要件に応じて使い分けます。