md5sum se equivoca con los nombres de archivos con espacios

md5sum se equivoca con los nombres de archivos con espacios

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 findcomando, 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

información relacionada