md5sum bagunçando nomes de arquivos com espaços

0

Estou tentando gerar um md5 para cada arquivo que não possui um atributo estendido user.comment e, em seguida, analise 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

Eu vi muitas pessoas usando o comando find , mas não sei como fazer isso funcionar no meu caso.

    
por Weekender 18.05.2015 / 12:25

1 resposta

0

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

Dito isso, 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 mais limpo, mas veja como fazer isso com 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
    
por 18.05.2015 / 15:48

Tags