copia arquivos com nome de destino baseado em md5 usando find e xargs

1

Eu tenho uma árvore de diretórios com muitos arquivos .dat , onde muitos deles contêm caracteres especiais. Eles são usados por outro processo que só é capaz de processar arquivos contendo caracteres ascii.

Minha idéia era find de todos os arquivos, criar um novo nome de arquivo baseado no hash md5 do caminho do arquivo e copiá-los para um novo diretório (eles não são muito grandes, e eu posso não alterar os originais).

Isso é o que eu tentei

find dat -type f -name "*.dat" -print0|xargs -0 -I file cp 'file' "datnew/$(echo file|md5).dat"

Infelizmente, ele só cria um único hash e copia todos os arquivos para esse nome de arquivo de saída:

$ touch dat/foo.dat
$ touch dat/bar.dat
$ find dat -type f -name "*.dat" -print0|xargs -0 -I file cp 'file' "datnew/$(echo file|md5).dat"
$ ls datnew
bbe02f946d5455d74616fc9777557c22.dat

Você pode, por favor, me dizer qual é o meu erro? Estou usando xargs de maneira errada?

    
por muffel 12.08.2015 / 11:49

1 resposta

1

Como file in $( echo $file | md5 ) não será interpretado, você precisa de uma solução alternativa.

Uma possibilidade é simplesmente canalizá-lo em um loop while e ler cada saída - nesse caso, melhor ignorar xargs como um todo

find ... | while read file ; do cp "$file" "datnew/$( echo "$file" | md5 )" ; done

Para usá-lo com -print0 , substitua o caractere nulo por uma nova linha usando tr

find ... -print0 | tr '
find ... | while read file ; do cp "$file" "datnew/$( echo "$file" | md5 )" ; done
0\' '\n' | while read ; do ... ; done
    
por 12.08.2015 / 12:38

Tags