OSX Командная строка Найти повторяющиеся имена файлов с различными расширениями

231
Tough Guy

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

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

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

find . -exec bash -c 'basename "$0" ".$"' {} \; | sort | uniq  find . -type f \( -name "*.jpg" -o -name "*.png" \) 

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

1

3 ответа на вопрос

3
AFH

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

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

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

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

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

найти: нелегальный вариант - т Tough Guy 5 лет назад 0
@ToughGuy - я не использовал ни одной опции `-t`, но в Linux` find .` подразумевается, если не указан каталог, и, возможно, его нет в OSX. Я добавил `.` и процитировал имя файла в` echo` на случай, если у вас есть какие-то нечетные имена файлов, которые могут появиться в качестве опций. AFH 5 лет назад 0
`-type` обычно понимается OSX find согласно [this] (https://ss64.com/osx/find.html) xenoid 5 лет назад 0
Да, для [`find` на Mac требуется` .` или любой путь] (https://superuser.com/a/1322373/432690), POSIX требует этого. Здесь на Super User я советую никогда не опускать `.` ради переносимости. Kamil Maciorowski 5 лет назад 0
@KamilMaciorowski - Спасибо: есть вещи, к которым я только что привык. Без Mac я не могу проверить каждую опцию каждой команды, если она не совместима. AFH 5 лет назад 0
1
Tough Guy

Я принимаю и ценю ответ. Тем временем я получил этот скрипт на 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 
Сопоставление по имени и альтернативным суффиксам полезно, но не гарантирует, что файлы являются реальными дубликатами. Вам нужно будет включить сравнение размеров файлов и, если они совпадают, фактически сравнить содержимое файла. Hogstrom 5 лет назад 0
0
slhck

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

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

Вот, %.*раздвигает расширение, так foo.x.yстановится foo.x.

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

Конечно, это дало мне длинный список всех файлов с количеством дубликатов. Могу ли я получить только дубликаты? (например, foo, который используется дважды или трижды) Tough Guy 5 лет назад 0