символическая ссылка: найти все файлы, которые ссылаются на этот файл

Привет всем, мне нужно сделать это в Linux:

  • Дано: имя файла 'foo.txt'
  • Найти: все файлы, которые являются символическими ссылками на «foo.txt».

Как это сделать? Спасибо!


person lukmac    schedule 31.05.2011    source источник


Ответы (3)


Это зависит от того, если вы пытаетесь найти ссылки на конкретный файл с именем foo.txt,, то это единственный хороший способ:

find -L / -samefile path/to/foo.txt

С другой стороны, если вы просто пытаетесь найти ссылки на любой файл с именем foo.txt, тогда что-то вроде

find / -lname foo.txt

or

find . -lname \*foo.txt # ignore leading pathname components
person DigitalRoss    schedule 31.05.2011
comment
проблема решена красиво. Спасибо всем людям, которые ответили. - person lukmac; 31.05.2011
comment
Как я прокомментировал удаленный ответ, вы можете использовать -xtype l, чтобы найти только список символических ссылок. - person Hasturkun; 31.05.2011
comment
вы можете захотеть повторить, так как любой из файлов, указывающих на foo.txt, может быть указан некоторыми другими ссылками... например: A-›B-›foo.txt, /tmp/C-›B-› foo.txt и т. д. - person Olivier Dulac; 07.11.2013
comment
это также может работать, если ваш компонент имени является родительским каталогом, указанным в ссылке, путем поиска find . -lname '*foo.dir*' (соответствует, например, file.txt -> ../foo.dir/file.txt) - person Yonatan; 07.06.2017

Найдите номер инода файла, а затем найдите все файлы с таким же номером инода:

$ ls -i foo.txt
41525360 foo.txt

$ find . -follow -inum 41525360

В качестве альтернативы попробуйте вариант lname для find, но это не сработает, если у вас есть относительные символические ссылки, например. a -> ../foo.txt

$ find . -lname /path/to/foo.txt
person dogbane    schedule 31.05.2011
comment
Если вы используете последнюю версию GNU find, вы также можете использовать опцию -samefile с -L для того же эффекта, без необходимости самостоятельно искать индексный дескриптор. - person Hasturkun; 31.05.2011
comment
Но это также найдет файлы в других файловых системах, которые имеют такой же номер индекса. - person DigitalRoss; 31.05.2011
comment
Если foo — это каталог, используйте ln -di в одной строке: find . -follow -inum $(ls -di foo.txt |cut -d" " -f1) - person rubo77; 07.08.2016
comment
Этот ответ неверен. Символическая ссылка не имеет того же индекса, что и ее цель. Это будет работать только для файла внутри папки с символической ссылкой. Но это не то, что было задано. - person Jules Lamur; 06.01.2018

Я предпочитаю использовать утилиту symlinks, которая также удобна при поиске битых симлинков. Установить:

sudo apt install symlinks

Показать все символические ссылки в текущей папке и подпапках:

symlinks -rv .
  • -r: рекурсивный
  • -v: подробный (показать все симлинки, а не только битые)

Чтобы найти конкретную символическую ссылку, просто grep:

symlinks -rv . | grep foo.txt
person Nik    schedule 11.08.2017
comment
Никогда раньше не слышал о символических ссылках (репозиторий). 'Полезная утилита для тех, кто поддерживает FTP-сайты, компакт-диски и дистрибутивы программного обеспечения Linux. Он сканирует каталоги на наличие символических ссылок и выводит их список на стандартный вывод, часто выявляя недостатки в дереве файловой системы». Отличный маленький древний инструмент древнего хакера ядра Mark Lord, «первоначальный разработчик и сопровождающий пакета производительности IDE для Linux, подсистемы драйверов Linux IDE, hdparm», который теперь поддерживается Дж. Брандтом Бакли. - person Rein State; 27.11.2020