1

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

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

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

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

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

Большинство из этих команд возвращает мне либо Nothing ИЛИ все файлы ИЛИ уникальные имена файлов, но не Duplicate.

3 ответа3

4

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

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.]

1

Я принимаю и ценю ответ. Тем временем я получил этот скрипт на 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
0

Вы должны использовать 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 как во второй команде.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .