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


115

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

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

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


Ответы:


132

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

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

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

find / -lname foo.txt

или

find . -lname \*foo.txt # ignore leading pathname components

проблема решена красиво. Спасибо всем, кто ответил.
lukmac

8
Как я прокомментировал удаленный ответ, вы можете использовать -xtype lдля поиска только символические
ссылки

вы можете захотеть выполнить рекурсию, поскольку любой из файлов, указывающих на foo.txt, может сам указывать на другие ссылки ... например: A-> B-> foo.txt, / tmp / C-> B-> foo.txt и т. д.
Оливье Дюлак

это также может сработать, если ваш компонент имени является родительским каталогом, указанным в ссылке, путем поиска find . -lname '*foo.dir*'(например, соответствует file.txt -> ../foo.dir/file.txt)
Йонатан,

22

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

$ ls -i foo.txt
41525360 foo.txt

$ find . -follow -inum 41525360

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

$ find . -lname /path/to/foo.txt

3
Если вы используете последнюю версию GNU find, вы также можете использовать -samefileопцию с -Lдля того же эффекта, без необходимости самостоятельно искать inode
Hasturkun

5
Но это также найдет файлы в других файловых системах, которые имеют такой же номер inode.
DigitalRoss

Если fooэто каталог, используйте ln -diв одной строке:find . -follow -inum $(ls -di foo.txt |cut -d" " -f1)
rubo77 07

1
Это неверный ответ. Символьная ссылка не имеет того же индексного дескриптора, что и ее цель. Это будет работать только для файла внутри папки с символической ссылкой. Но спрашивали не об этом.
Жюль Ламур

4

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

sudo apt install symlinks

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

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

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

symlinks -rv . | grep foo.txt
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.