Linha de comando do OSX Encontre nomes de arquivos duplicados com extensões diferentes

Linha de comando do OSX Encontre nomes de arquivos duplicados com extensões diferentes

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 .jpgos arquivos e verifica se o .pngarquivo correspondente existe e exibe o caminho completo sem as extensões.

Observe que se houver muito menos .pngarquivos, será mais eficiente procurá-los e verificar os .jpgarquivos correspondentes.

[Testado bashno 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 -cpara 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.yfica foo.x.

Em vez de um simples find . -type f, que encontraria todos os arquivos, você também poderia filtrar *.jpgou *.pngarquivos como no seu segundo comando.

informação relacionada