md5sum bagunçando nomes de arquivos com espaços

md5sum bagunçando nomes de arquivos com espaços

Estou tentando gerar um md5 para cada arquivo que não possui o atributo estendido user.comment e, em seguida, analisar esse md5 no atributo estendido do arquivo. Meu script funciona bem, mas apenas para nomes de arquivos que não possuem espaços.

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 muitas pessoas usando o findcomando, mas não sei como fazê-lo funcionar no meu caso.

Responder1

Seu principal problema é,como apontado por @wigy, que você não está citando sua variável. Isso significa que um nome de arquivo com espaços em branco será tratado como arquivos separados. A regra geral é que você devesemprecite suas variáveis, a menos que você tenha um bom motivo para não fazê-lo.

Dito isto, aqui está uma versão simplificada do seu 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 shell globs, como você fez, geralmente é mais simples e limpo, mas veja como fazer isso 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

informação relacionada