Какой самый быстрый способ найти все файлы с одинаковым индексом? - PullRequest
8 голосов
/ 27 августа 2009

Единственный способ, которым я знаю, это:

find /home -xdev -samefile file1

Но это действительно медленно. Я хотел бы найти такой инструмент, как locate. Реальные проблемы возникают, когда у вас много файлов, я полагаю, что операция O (n).

Ответы [ 4 ]

8 голосов
/ 29 августа 2009

Нет сопоставления от inode для имени. Единственный способ - обойти всю файловую систему, которая, как вы указали, является O (количество файлов). (На самом деле, я думаю, что это & ​​theta; (количество файлов)).

5 голосов
/ 27 августа 2009

Вот способ:

  • Используйте find -printf "%i:\t%p или аналогичный для создания списка всех файлов с префиксом inode и вывода во временный файл
  • Извлеките первое поле - индекс с добавленным ':' - и сортируйте, чтобы собрать дубликаты вместе, а затем ограничьте дубликаты, используя cut -f 1 | sort | uniq -d, и выведите их во второй временный файл
  • Используйте fgrep -f, чтобы загрузить второй файл в виде списка строк для поиска и поиска первого временного файла.

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

На своей собственной машине я часто использую такие файлы и сохраняю их отсортированными. У меня также есть приложение для индексирования текста, которое затем может применить бинарный поиск, чтобы быстро найти все строки с общим префиксом. Такой инструмент оказывается весьма полезным для таких работ, как этот.

4 голосов
/ 18 августа 2014

Я знаю, что это старый вопрос, но многие версии find имеют опцию inum, чтобы легко соответствовать известному номеру inode.Вы можете сделать это с помощью следующей команды:

find . -inum 1234

Это все равно будет проходить через все файлы, если это разрешено, но как только вы получите совпадение, вы всегда можете остановить его вручную;Я не уверен, есть ли у find возможность остановиться после одного совпадения (возможно, с помощью оператора -exec?)

Это намного проще, чем вывод данных в файл, сортировка и т. Д. И т. Д.методы, поэтому следует использовать, когда они доступны.

0 голосов
/ 27 августа 2009

Что я обычно делаю: ls -i <file>, чтобы получить индекс этого файла, а затем find /dir -type f -inum <inode value> -mount. (Вы хотите, чтобы -mount избегал поиска в разных файловых системах, что, вероятно, является частью ваших проблем с производительностью.)

Кроме этого, я думаю, что это об этом.

...