
Passei por todas as perguntas semelhantes e instalei alguns utilitários de linha de comando como o duff, mas sem sucesso.
No meu diretório de Imagens, tenho imagens com o mesmo nome, mas com extensões diferentes (jpg e png). Eu só quero imprimir os nomes dos arquivos duplicados com extensões diferentes. (por exemplo, foo.jpg & foo.png) Ou pelo menos um nome de arquivo (foo)
Até agora eu tentei esses métodos
find . -exec bash -c 'basename "$0" ".${0##*.}"' {} \; | sort | uniq
find . -type f \( -name "*.jpg" -o -name "*.png" \)
A maioria desses comandos me retorna oNadaOUTodos os arquivosOUexclusivonomes de arquivos, mas não oDuplicados.
Responder1
Eu sugeriria uma modificação do seu segundo comando:
find . -type f -name "*.jpg" | \
while read -r f; do [ -e "${f%.jpg}.png" ] && echo "${f%.jpg}"; done
Isto localiza todos .jpg
os arquivos e verifica se o .png
arquivo correspondente existe e exibe o caminho completo sem as extensões.
Observe que se houver muito menos .png
arquivos, será mais eficiente procurá-los e verificar os .jpg
arquivos correspondentes.
[Testado bash
no Ubuntu 18.04.1.]
Responder2
Aceito e agradeço a resposta. Enquanto isso, recebi esse script python que funcionou um pouco próximo do que eu estava procurando. Tentei encontrar a fonte, mas não consegui encontrá-la em centenas de guias que pesquisei.
#!/usr/bin/env python
# Syntax: duplicates.py DIRECTORY
import os, sys
top = sys.argv[1]
d = {}
for root, dirs, files in os.walk(top, topdown=False):
for name in files:
fn = os.path.join(root, name)
basename, extension = os.path.splitext(name)
basename = basename.lower() # ignore case
if basename in d:
print(d[basename])
print(fn)
else:
d[basename] = fn
Salve este arquivo como duplicatas.py e conceda-lhe direitos e execute-o na pasta.
./duplicates.py Images
Responder3
Você deve usar uniq -c
para obter as contagens e, em seguida, classificar inversamente no final para listar as duplicatas primeiro. No final awk
é usado para filtrar linhas que começam com 2 ou superior.
$ find . -type f -exec sh -c 'basename ${0%.*}' {} \; | sort | uniq -c | sort -r | awk 'int($1)>=2'
2 foo
Aqui, %.*
retira a extensão, então foo.x.y
fica foo.x
.
Em vez de um simples find . -type f
, que encontraria todos os arquivos, você também poderia filtrar *.jpg
ou *.png
arquivos como no seu segundo comando.