
Я рассмотрел все подобные вопросы + установил несколько утилит командной строки, таких как 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
файлам, как во второй команде.