Как найти все символические ссылки, указывающие на любой файл / каталог внутри данного каталога

15

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

Я хочу удалить такой каталог, но я не уверен, что это безопасно, так как в другом каталоге (давайте назовем его /dir2) у меня могут быть символические ссылки, указывающие на внутренние части /dir1.

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

Антонелло
источник

Ответы:

15

Вы можете найти все символические ссылки, используя:

find / -type l 

Возможно, вы захотите запустить его как root, чтобы попасть в любое место на диске.

Вы можете расширить их, используя, readlink -fчтобы получить полный путь ссылки, и вы должны иметь возможность grepвыводить данные в целевой каталог, который вы хотите удалить:

find / -type l -exec readlink -f {} + | grep -F /dir2

Использование find / -type l -printf '%l\n'не работает, так как вы получаете относительные ссылки, ../tmp/xyzкоторые могут указывать на ваш целевой каталог, но не совпадают, потому что они не полностью раскрыты.

Энтон
источник
1
В случае поддерева может быть полезно перейти по символическим find -L /subtree -xtype l -exec readlink -f {} +
ссылкам
3

В моем случае принятый ответ оказался бесполезным (поскольку он не выводил источник ссылки). Вот что сработало для меня.

Я работал над этим, используя два -execусловия:

find /home/ -type l -exec readlink -nf {} ';' -exec echo " -> {}" ';' | grep "/dir2"
Дориан Маршал
источник
1

С zsh:

printf '%s\n' /dir2/**/*(D@e'([[ $REPLY:P = /dir1(/*|) ]])')
Стефан Шазелас
источник