md5sum verwirrt mit Dateinamen mit Leerzeichen

760
Weekender

Ich versuche, eine MD5 für jede Datei zu generieren, die kein erweitertes Attribut user.comment enthält, und dann diese MD5 im erweiterten Attribut der Datei zu analysieren. Mein Skript funktioniert gut, 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 viele Leute gesehen, die findstattdessen den Befehl verwendet haben, aber ich weiß nicht, wie ich es für meinen Fall schaffen kann.

0
Hilft es, "" das $ f hinzuzufügen? Wie in `md5sum" $ f "` wigy vor 8 Jahren 2
Heilig! Sie der Mann lol Ich kann nicht glauben, dass ich das vermisst habe, vielen Dank :) Weekender vor 8 Jahren 0
;) Weiter so mit dem Scripting! wigy vor 8 Jahren 0

1 Antwort auf die Frage

0
terdon

Ihr Hauptproblem ist, wie @wigy darauf hinweist, dass Sie Ihre Variable nicht zitieren. Dies bedeutet, dass ein Dateiname mit Leerzeichen als separate Dateien behandelt wird. Als Faustregel gilt, dass Sie das tun sollten Ihre Variablen immer angeben denn, Sie haben einen guten Grund, dies nicht zu tun.

Das heißt, hier ist 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 

Mit Shell Kleckse, wie Sie getan haben, ist in der Regel einfacher und sauberer, aber hier ist, wie es zu tun mit 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