Лучший способ найти дубликат определенного файла или определенного набора файлов

#linux #bash

#linux #bash

Вопрос:

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

Чтобы уточнить, если я вызываю

 fdupes dir1 dir2
  

Результатом будут все дубликаты файлов, найденные в собранном наборе файлов в dir1 и dir2 . Однако мне бы очень хотелось иметь возможность делать что-то вроде

 fdupes-alternative file dir
  

чтобы найти дубликаты file в dir , не беспокоясь о дубликатах файлов в dir . Или даже возможность чего-то вроде

 fdupes-alternative dir1 dir2
  

и проверить, dir1 дублируются ли какие-либо файлы в dir2 , опять же, игнорируя дубликаты, если они либо все в dir1 , либо dir2 .

Существуют ли какие-либо инструменты, которые делают подобные вещи, или какой-либо простой способ сделать что-то подобное?

Комментарии:

1. Ваш вопрос настолько краток, что его буквально можно воспринимать по-разному. Например, считаете ли вы ссылки дубликатами? Или просто файлы с одинаковыми хэшами? В случае жестких ссылок, если вы хотите удалить одну из них (очевидное последующее действие), что бы вы предприняли?

2. Вопросы, в которых нас просят порекомендовать или найти книгу, инструмент , библиотеку программного обеспечения, учебное пособие или другой сторонний ресурс, не относятся к теме Stack Overflow […].

Ответ №1:

Вы можете фильтровать группы по интересующему контенту.

Предполагая fdupes формат вывода строки на файл плюс пустую строку для разделения групп, если вас интересует файл, отфильтруйте группы, которые содержат имя файла в виде строки. Например, с помощью awk:

 fdupes file dir |
awk -v F=file '
    BEGIN { FS="n"; RS="nn" }
    {
        for (i=NF; i; i--)
            if ($i==F) {
                printf("%s%s", x  ?RS:"", $0)
                break
            }
    }
'
  

Если вас интересует каталог, отфильтруйте группы, содержащие строки, начинающиеся с этого каталога. Например, снова с помощью ‘awk’:

 fdupes dir1 dir2 |
awk -v D=dir1/ '
    BEGIN { FS="n"; RS="nn" }
    {
        for (i=NF; i; i--)
            if (index($i,D)==1) {
                printf("%s%s, x  ?RS:"", $0
                break
            }
    }