私は、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