Mesclar dois diretórios no Linux para obter todos os arquivos exclusivos

1

Eu tenho que diretórios, vamos chamá-los de folder1 e folder2 . Em cada uma dessas pastas, há imagens denominadas 1.jpg , 2.jpg e assim por diante.

Infelizmente, o arquivo 1.jpg em folder1 pode ser outra imagem do que 1.jpg em folder2 . Além disso, é possível que o arquivo 1.jpg em folder1 seja a mesma imagem que 42.jpg em folder2 . Então eu não posso usar o nome do arquivo para distinguir essas imagens.

A ideia agora é usar o hash em vez do nome do arquivo.

O objetivo é mesclar as duas pastas em uma terceira, para que a pasta de destino contenha todas as imagens exclusivas de ambas as pastas.

Existe uma solução simples para este problema?

    
por Dennis 28.12.2017 / 15:12

3 respostas

0

Se você não se importa com os nomes, em cada pasta, mova os arquivos para a pasta de destino, renomeando-os após o hash MD5:

for f in folder1/* folder2/*;do mv -nv "$f" target/$(md5sum -b "$f" | cut -d ' ' -f 1); done

-n não é estritamente necessário, evita que o primeiro arquivo movido seja danificado por um segundo arquivo idêntico. Assim, o resultado final é que, com isso, as duplicatas são deixadas em seus diretórios de origem e você tem uma idéia de quantos duplicados você teve).

Em seguida, se necessário, forneça outro conjunto de nomes arbitrários (execute em target ):

ls | cat -n | while read n f; do mv "$f" "$n.extension"; done

(one-liner acima de aqui )

    
por 28.12.2017 / 17:38
0

Eu executei um localizador de arquivos duplicados (há muitos, escolha seu favorito) nas duas pastas, para reduzi-los a um único conjunto de conteúdo exclusivo. Em seguida, uma renomeação em massa de * para folder1_* na primeira pasta, semelhante em segundo, para garantir nomes exclusivos. Em seguida, mescle os dois com um movimento de arquivo comum.

    
por 28.12.2017 / 15:29
-1

Isso deve ser feito, para se adaptar um pouco com base nas convenções de nomenclatura, e você perde os nomes originais (caso contrário, você precisa descobrir o que fazer se tiver o mesmo nome duas vezes com conteúdo diferente).

(for file in folder1/* folder2/* ; do md5sum $file ; done) | sort | awk '{print $2 " " $1}' | uniq -f 1 -c | while read count name hash ; do cp $name dest/$hash ; done

Ou se você não quiser perder o nome do arquivo original, basta alterá-lo:

(for file in folder1/* folder2/* ; do md5sum $file ; done) | sort | awk '{print $2 " " $1}' | uniq -f 1 -c | while read count name hash ; do cp $name dest/$(echo $name | sed -e 's/\//_/') ; done

Há muitas suposições feitas para simplificar: nenhum caminho com espaços, fazendo coisas sobre ambos os diretórios, fazendo a saída no diretório dest/ etc. Muitas coisas podem ser corrigidas dependendo de suas necessidades específicas, mas o que está acima é uma base de trabalho.

    
por 28.12.2017 / 15:56

Tags