Desduplica arquivos usando a linha de comando no OSX Lion

3

Estou usando o OSX 10.8.4 e gostaria de remover arquivos duplicados em um único diretório simples se um hash md5 corresponder.

Procurei várias respostas, mas nenhuma delas funcionou para mim, acho que por causa das diferenças na sintaxe de comando entre as versões do terminal.

Coisas que tentei:

link

Encontrando e removendo arquivos duplicados no osx com um script

e alguns deles: link

Essa abordagem parece mais próxima:

find . -size 20 \! -type d -exec cksum {} \; | sort | tee /tmp/f.tmp | cut -f 1,2 -d ' ' | uniq -d | grep -hif - /tmp/f.tmp > duplicates.txt

Mas recebo um erro: grep: -: No such file or directory

Após a inspeção, o /tmp/f.tmp existe. O arquivo duplicates.txt é criado, mas está vazio.

Como faço para deduplicar esses arquivos?

    
por SimplGy 17.08.2013 / 19:27

2 respostas

1

Por padrão, no Mac OS, você obterá BSD grep , enquanto o comando que você publicou provavelmente será para GNU grep . As duas versões das ferramentas são semelhantes, mas não idênticas. Isso também é verdade para outras ferramentas (por exemplo, as versões GNU e BSD de date se comportam de maneira um pouco diferente).

O problema é o - após o comando grep. O GNU grep interpreta isso como stdin (assim, aquelas linhas que foram identificadas como duplicatas por uniq -d ), enquanto o BSD grep está realmente procurando por um tempo chamado - ; daí a mensagem de erro:

>> find . \! -type d -exec cksum {} \; | sort | tee /tmp/f.tmp | cut -f 1,2 -d ' ' | uniq -d | grep -hif - /tmp/f.tmp
grep: -: No such file or directory

O mesmo acontece se você substituir o - por outro nome que não corresponda a nenhum arquivo:

>> find . \! -type d -exec cksum {} \; | sort | tee /tmp/f.tmp | cut -f 1,2 -d ' ' | uniq -d | grep -hif unknown-file /tmp/f.tmp
grep: unknown-file: No such file or directory

Você pode substituir o processo do bash para alimentar a stdout de tudo até o uniq to grep como um arquivo, por exemplo (Eu deixei cair o critério de tamanho neste exemplo, mas o resto é o mesmo):

>> grep -hif <(find . \! -type d -exec cksum {} \; | sort | tee /tmp/f.tmp | cut -f 1,2 -d ' ' | uniq -d) /tmp/f.tmp
4192268874 275 ./foo/META-INF/leiningen/foo/foo/project.clj
4192268874 275 ./foo/project.clj
    
por 04.06.2014 / 18:04
3

Encontrar duplicatas com base no hashkey funciona bem e é muito rápido. Eu uso o seguinte código com freqüência. Se você estiver executando isso em um Mac e enfrentar qualquer problema, instale as ferramentas GNU e use a segunda versão.

Linux

find -not -empty -type f -printf "%s\n" | sort -rn | uniq -d | xargs -I{} -n1 find -type f -size {}c -print0 | xargs -0 md5sum | sort | uniq -w32 --all-repeated=separate

versão para Mac

gfind -not -empty -type f -printf "%s\n" | sort -rn | guniq -d | xargs -I{} -n1 find -type f -size {}c -print0 | xargs -0 gmd5sum | sort | guniq -w32 --all-repeated=separate

    
por 03.09.2014 / 04:04