Estoy intentando generar un md5 para cada archivo que no tiene el atributo extendido user.comment y luego analizar ese md5 en el atributo extendido del archivo. Mi secuencia de comandos funciona bien, pero solo para nombres de archivos que no tienen espacios.
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
Vi a mucha gente usando el find
comando, pero no sé cómo hacerlo funcionar en mi caso.
Respuesta1
Tu principal problema es,como lo señaló @wigy, que no estás citando tu variable. Esto significa que un nombre de archivo con espacios en blanco se tratará como archivos separados. La regla general es que debessiemprecite sus variables a menos que tenga una muy buena razón para no hacerlo.
Dicho esto, aquí tienes una versión simplificada de tu script:
#!/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
Usar globos de shell, como lo hizo usted, es generalmente más simple y limpio, pero aquí se explica cómo hacerlo con 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