md5sum bringt Dateinamen mit Leerzeichen durcheinander

md5sum bringt Dateinamen mit Leerzeichen durcheinander

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 findstattdessen 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

verwandte Informationen