cria o hash md5 de uma listagem de arquivos recursivos quando alguns caminhos possuem espaços

6

Eu preciso criar um hash md5 de cada diretório e arquivo dentro de um diretório principal. A única coisa que me impede de ter sucesso é descobrir uma maneira de contornar arquivos com um espaço no caminho.

Estou usando o find para a listagem recursiva (eu li que o find é a melhor maneira de fazer isso):

c5-26-1# find /root/newdir
/root/newdir
/root/newdir/1
/root/newdir/2
/root/newdir/3
/root/newdir/4
/root/newdir/5
/root/newdir/newdir2
/root/newdir/newdir2/1
/root/newdir/newdir2/2
/root/newdir/new
/root/newdir/dir
/root/newdir/new dir

Quando eu tento isso com md5, obtenho dois resultados diferentes, nenhum dos quais funciona:

c5-26-1# md5 $(find /root/newdir) # same outcome using for loop
MD5 (/root/newdir) = bc79a580f6c932937f6fcd454747db72
MD5 (/root/newdir/1) = 94ca98295946310ce88e185ea57486d5
MD5 (/root/newdir/2) = 8432051f64459be5a5e73dc2abd91795
MD5 (/root/newdir/3) = d41d8cd98f00b204e9800998ecf8427e
MD5 (/root/newdir/4) = d41d8cd98f00b204e9800998ecf8427e
MD5 (/root/newdir/5) = d41d8cd98f00b204e9800998ecf8427e
MD5 (/root/newdir/newdir2) = 722165901468b9596dbdddfe118759fb
MD5 (/root/newdir/newdir2/1) = d41d8cd98f00b204e9800998ecf8427e
MD5 (/root/newdir/newdir2/2) = d41d8cd98f00b204e9800998ecf8427e
MD5 (/root/newdir/new) = 89d042c5f9d6ba485a654b543685ea86
MD5 (/root/newdir/dir) = 148538718feba14839f5d1072854c5f4
MD5 (/root/newdir/new) = 89d042c5f9d6ba485a654b543685ea86
MD5 (dir) = 148538718feba14839f5d1072854c5f4

ou

c5-26-1# find -X /root/newdir | xargs md5
find: /root/newdir/new dir: illegal path
MD5 (/root/newdir) = bc79a580f6c932937f6fcd454747db72
MD5 (/root/newdir/1) = 94ca98295946310ce88e185ea57486d5
MD5 (/root/newdir/2) = 8432051f64459be5a5e73dc2abd91795
MD5 (/root/newdir/3) = d41d8cd98f00b204e9800998ecf8427e
MD5 (/root/newdir/4) = d41d8cd98f00b204e9800998ecf8427e
MD5 (/root/newdir/5) = d41d8cd98f00b204e9800998ecf8427e
MD5 (/root/newdir/newdir2) = 722165901468b9596dbdddfe118759fb
MD5 (/root/newdir/newdir2/1) = d41d8cd98f00b204e9800998ecf8427e
MD5 (/root/newdir/newdir2/2) = d41d8cd98f00b204e9800998ecf8427e
MD5 (/root/newdir/new) = 89d042c5f9d6ba485a654b543685ea86
MD5 (/root/newdir/dir) = 148538718feba14839f5d1072854c5f4

Como faço para contar diretórios com espaços?

    
por MaQleod 05.11.2011 / 00:03

3 respostas

11

xargs raramente é útil, porque espera entrada citada de uma maneira altamente peculiar que nenhuma ferramenta comum produz. E como você notou, mycommand $(find …) não é bom, porque primeiro concatena todos os nomes de arquivos e depois divide no espaço em branco.

Use o -exec primary de find para executar md5 sem nenhum shell intermediário que exija aspas. Se a sua implementação de find for razoavelmente atual, você poderá fazer com que o xargs seja famoso, o que é invocar o programa md5 uma vez por lote de argumentos.

find /root/newdir -type f -exec md5 {} +

Se o seu find não for compatível com -exec … {} + , substitua o + por \; . Isso faz com que find invoque md5 para cada arquivo por vez. É um pouco mais lento, mas está disponível em todos os lugares.

    
por 05.11.2011 / 00:23
6

Por que não usar apenas a ferramenta md5deep que faz exatamente isso? A maioria das distribuições Linux inclui isso, geralmente em um pacote chamado md5deep .

    
por 05.11.2011 / 02:50
0

Se você usar a opção -exec para find , acho que isso será automaticamente escapado para você.

    
por 05.11.2011 / 00:08