md5sum がスペースを含むファイル名を混乱させる

md5sum がスペースを含むファイル名を混乱させる

私は、user.comment 拡張属性を持たない各ファイルに対して md5 を生成し、そのファイルの拡張属性でその md5 を解析しようとしています。私のスクリプトは正常に動作しますが、スペースを含まないファイル名に対してのみ動作します。

cd /tank/test
shopt -s nullglob
for f in *.txt
do
  if [[ -n $(getfattr -n user.comment "$f") ]]; then
    continue
  else
    md5=($(md5sum $f))
    setfattr -n user.comment -v "$md5" "$f"
  fi
done

代わりにコマンドを使用している人がたくさんいるのを見ましたfindが、自分のケースでそれを機能させる方法がわかりません。

答え1

あなたの主な問題は、@wigyが指摘したように変数を引用符で囲んでいないことに注意してください。これは、空白を含むファイル名が別のファイルとして扱われることを意味します。一般的な経験則は、いつも特別な理由がない限り、変数を引用符で囲んでください。

とはいえ、スクリプトの簡略版は次のとおりです。

#!/usr/bin/env bash

shopt -s nullglob
for f in /tank/test/*txt
do
    [[ -n $(getfattr -n user.comment "$f" 2>/dev/null) ]] ||
        setfattr -n user.comment -v "$(md5sum "$f")" "$f"
done

あなたが行ったように、シェル グロブを使用する方が一般的にはシンプルでクリーンですが、次のように実行しますfind

find /tank/test/ -type f -name '*.txt' -print0 |
 while IFS= read -r -d '' f
 do
     [[ -n $(getfattr -n user.comment "$f" 2>/dev/null) ]] ||
         setfattr -n user.comment -v "$(md5sum "$f")" "$f"
 done

関連情報