Ich versuche, für jede Datei, die kein erweitertes user.comment-Attribut hat, einen MD5-Wert zu generieren und diesen MD5 dann im erweiterten Attribut der Datei zu analysieren. Mein Skript funktioniert einwandfrei, aber nur für Dateinamen, die keine Leerzeichen enthalten.
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
Ich habe gesehen, dass viele Leute find
stattdessen den Befehl verwenden, weiß aber nicht, wie ich das in meinem Fall zum Laufen bekomme.
Antwort1
Ihr Hauptproblem ist,wie von @wigy hervorgehoben, dass Sie Ihre Variable nicht in Anführungszeichen setzen. Das bedeutet, dass ein Dateiname mit Leerzeichen als separate Datei behandelt wird. Die allgemeine Faustregel lautet:stetsGeben Sie Ihre Variablen in Anführungszeichen an, es sei denn, Sie haben einen sehr guten Grund, dies nicht zu tun.
Vor diesem Hintergrund finden Sie hier eine vereinfachte Version Ihres Skripts:
#!/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
Die Verwendung von Shell-Globs, wie Sie es getan haben, ist im Allgemeinen einfacher und sauberer, aber so geht's 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