символна връзка: намира всички файлове, които имат връзка към този файл

Здравейте на всички, трябва да направя това в 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

Намерете номера на inode на файла и след това потърсете всички файлове със същия номер на inode:

$ 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 за същия ефект, без да се налага сами да търсите inode - person Hasturkun; 31.05.2011
comment
Но това ще намери и файлове на други файлови системи, които случайно имат същия номер на inode. - 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
Този отговор е грешен. Символната връзка няма същия inode като нейната цел. Това ще работи само за файл в папка със символна връзка. Но не това беше попитано. - 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 сайтове, CDROM дискове и софтуерни дистрибуции на Linux. Той сканира директории за символни връзки и ги изброява на stdout, често разкривайки пропуски в дървото на файловата система.' Страхотен малък древен инструмент от древен хакер на ядрото Mark Lord, „първоначален разработчик и поддържащ IDE Performance Package за linux, подсистемата Linux IDE Driver, hdparm“, сега се поддържа от J. Brandt Buckley. - person Rein State; 27.11.2020