Este comando irá renomear todos os arquivos para o md5sum do seu conteúdo. Isso significa que arquivos com o mesmo conteúdo receberão o mesmo nome.
for f in *; do mv $f $(md5sum $f | cut -d " " -f 1); done
Você pode substituir md5sum
por sha1sum
no comando.
Para esta demonstração, adicionei -v
a mv
, para que possamos ver o que está sendo renomeado.
$ echo 1 > a
$ echo 2 > b
$ echo 1 > c
$ ls -1
a
b
c
$ for f in *; do mv -v $f $(md5sum $f | cut -d " " -f 1); done
'a' -> 'b026324c6904b2a9cb4b88d6d61c81d1'
'b' -> '26ab0db90d72e28ad0ba1e22ee510510'
'c' -> 'b026324c6904b2a9cb4b88d6d61c81d1'
$ ls -1
26ab0db90d72e28ad0ba1e22ee510510
b026324c6904b2a9cb4b88d6d61c81d1
Você também pode executar esse comando com segurança em um diretório em que alguns arquivos tenham o nome do arquivo unificado, enquanto outros não.
$ echo 1 > d
$ echo 2 > e
$ ls -1
26ab0db90d72e28ad0ba1e22ee510510
b026324c6904b2a9cb4b88d6d61c81d1
d
e
$ for f in *; do mv -v $f $(md5sum $f | cut -d " " -f 1); done
mv: '26ab0db90d72e28ad0ba1e22ee510510' and '26ab0db90d72e28ad0ba1e22ee510510' are the same file
mv: 'b026324c6904b2a9cb4b88d6d61c81d1' and 'b026324c6904b2a9cb4b88d6d61c81d1' are the same file
'd' -> 'b026324c6904b2a9cb4b88d6d61c81d1'
'e' -> '26ab0db90d72e28ad0ba1e22ee510510'
$ ls -1
26ab0db90d72e28ad0ba1e22ee510510
b026324c6904b2a9cb4b88d6d61c81d1
Observe que ele ainda calculará o hash dos arquivos que já estão em hash. Então, se os arquivos são enormes, você pode querer evitar o rehashing.