Você tem
$ tree
.
|-- A
| |-- a.txt
| |-- b.txt
| '-- c.txt
'-- B
|-- a.txt
|-- b.txt
'-- c.txt
2 directories, 6 files
Usando fdupes
:
$ fdupes -1 A B
A/b.txt B/b.txt
fdupes
detecta duplicatas com base no conteúdo do arquivo. O sinalizador -1
faz com que ele exiba os nomes de arquivos de cada conjunto de duplicatas em uma única linha. Aqui, ele detecta que os arquivos b.txt
são idênticos.
Você pode usar fdupes
para excluir duplicatas:
$ fdupes --delete A B
[1] A/b.txt
[2] B/b.txt
Set 1 of 1, preserve files [1 - 2, all]: 1
[+] A/b.txt
[-] B/b.txt
Ele interativamente pergunta qual arquivo manter (ou manter ambos). Eu escrevi 1
, então o arquivo A/b.txt
foi mantido enquanto B/b.txt
foi deletado.
Consulte o manual para fdupes
( man fdupes
). Se não estiver instalado em seu sistema, use um gerenciador de pacotes para instalá-lo. Ele também pode ser feito para excluir automaticamente os arquivos sem a solicitação interativa, mas é preciso ter cuidado ao executá-lo dessa maneira. Sempre faça um backup dos seus dados antes de executar um comando que possa excluir arquivos.
Observe que fdupes
sempre manterá pelo menos um dos duplicados. Se você deseja excluir todas as duplicatas, talvez esteja interessado nesta versão corrigida de fdupes
mencionada em uma resposta a uma pergunta semelhante feita em SuperUser: link (eu não testei isso).
O motivo pelo qual sugiro usar fdupes
em vez de analisar o arquivo de log que você tem é que os nomes de arquivo incorporados em um documento de texto são difíceis de analisar corretamente. Pode não ser sempre difícil (e neste exemplo em particular, seria fácil), mas note que o Unix permite tanto espaços quanto novas linhas nos nomes de arquivos e diretórios. É tecnicamente possível ter um diretório chamado
a.txt
Same: A=
com uma nova linha incorporada no nome.