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

1

Eu passei por todas as perguntas semelhantes + instalei alguns utilitários de linha de comando como duff, mas sem sucesso.

No meu diretório Imagens, tenho imagens com o mesmo nome, mas com extensões diferentes (jpg & png). Eu só quero imprimir os nomes de arquivos duplicados com diferentes extensões. (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 os nomes de arquivos Nada OU Todos os arquivos OU exclusivos , mas não os Duplicados .

    
por Tough Guy 11.10.2018 / 13:34

3 respostas

3

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

Isso localiza todos os arquivos .jpg e verifica se o arquivo .png correspondente existe e exibe o caminho completo sem as extensões.

Observe que, se houver muito menos arquivos .png , será mais eficiente procurar por eles e verificar os arquivos .jpg correspondentes.

[Testado com bash no Ubuntu 18.04.1.]

    
por 11.10.2018 / 14:04
1

Eu aceito e agradeço a resposta. Enquanto isso eu peguei este script python que funcionou um pouco perto do que eu estava procurando. Tentei encontrar a fonte, mas não consegui encontrá-la em centenas de guias que eu 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 duplicates.py e dê a ele direitos e, em seguida, execute-o na pasta.

./duplicates.py Images
    
por 11.10.2018 / 14:54
0

Você precisa usar uniq -c para obter as contagens e, em seguida, ordenar inversamente no final para listar as duplicatas primeiro. No final, awk é usado para filtrar as linhas que começam com 2 ou mais.

$ find . -type f -exec sh -c 'basename ${0%.*}' {} \; | sort | uniq -c | sort -r | awk 'int($1)>=2'
   2 foo

Aqui, %.* retira a extensão, por isso foo.x.y torna-se foo.x .

Em vez de um simples find . -type f , que encontraria todos os arquivos, você também poderia filtrar por *.jpg ou *.png arquivos como em seu segundo comando.

    
por 11.10.2018 / 13:45