Командная строка OSX: поиск дубликатов имен файлов с разными расширениями

Командная строка OSX: поиск дубликатов имен файлов с разными расширениями

Я рассмотрел все подобные вопросы + установил несколько утилит командной строки, таких как duff, но безуспешно.

В моем каталоге Images есть изображения с одинаковыми именами, но с разными расширениями (jpg и png). Я просто хочу вывести имена файлов с одинаковыми именами с разными расширениями. (например, foo.jpg и foo.png) Или хотя бы одно имя файла (foo)

До сих пор я пробовал эти методы

find . -exec bash -c 'basename "$0" ".${0##*.}"' {} \; | sort | uniq

find . -type f \( -name "*.jpg" -o -name "*.png" \)

Большинство этих команд возвращают мне либоНичегоИЛИВсе файлыИЛИуникальныйимена файлов, но неДубликаты.

решение1

Я бы предложил модификацию вашей второй команды:

find . -type f -name "*.jpg" | \
    while read -r f; do [ -e "${f%.jpg}.png" ] && echo "${f%.jpg}"; done

Эта функция находит все .jpgфайлы и проверяет, существует ли соответствующий .pngфайл, а затем отображает полный путь без расширений.

Обратите внимание, что если файлов намного меньше, .pngбудет эффективнее выполнить их поиск и проверить наличие соответствующих .jpgфайлов.

[Проверено bashна Ubuntu 18.04.1.]

решение2

Я принимаю и ценю ответ. Между тем я получил этот скрипт python, который работал довольно близко к тому, что я искал. Я пытался найти исходник, но не смог найти его в сотнях вкладок, которые я искал.

#!/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

Сохраните этот файл как duplicates.py и предоставьте ему права, а затем запустите его в папке.

./duplicates.py Images

решение3

Вам нужно использовать uniq -cдля получения счетчиков, затем выполнить обратную сортировку в конце, чтобы сначала вывести дубликаты. В конце awkиспользуется для фильтрации строк, начинающихся с 2 или выше.

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

Здесь %.*удаляет расширение, поэтому foo.x.yстановится foo.x.

Вместо простого find . -type f, который найдет все файлы, вы также можете отфильтровать по *.jpgили *.pngфайлам, как во второй команде.

Связанный контент