Найти все абсолютные ссылки в дереве каталогов

8

Как мне (рекурсивно) обнаружить все символические ссылки в каталоге, которые идентифицируют свою цель в абсолюте, а не относительным образом?

Так как эти ссылки могут быть разорваны при перемещении всего дерева каталогов, я хотел бы иметь способ их идентификации.

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

Маркус Юний Брут
источник

Ответы:

15

Для того, чтобы найти абсолютные ссылки, вы можете использовать find«s -lnameвариант , если ваши findопоры , что (он доступен по крайней мере , в GNU find, на FreeBSD и MacOS):

find . -type l -lname '/*'

При этом findнеобходимо напечатать имена файлов, которые являются символическими ссылками и чье содержимое (целевое) совпадает /*с использованием оболочки.

Строго говоря, POSIX указывает, что абсолютные пути начинаются с одного, /трех или более/ ; чтобы соответствовать этому, вы можете использовать

find . -lname '/*' ! -lname '//*' -o -lname '///*'

На каких системах // foo / bar отличается от / foo / bar? есть более подробная информация об этом.

(Спасибо Сато Кацура за то, что он указал, что -lnameэто специфично для GNU, fd0 за то, что он упомянул, что он на самом деле также доступен, по крайней мере, на FreeBSD и macOS, и Стефану Шазеласу за использование определения абсолютного пути POSIX.)

Стивен Китт
источник
Я собирался написать: find ./ -t l -exec ls -l {} \;что должно быть безопасной альтернативой. Было бы легко разобрать его вывод и делать то, что нужно.
Сентиман
@Centimane посмотрим, почему бы не разобрать ls? ...
Стивен Китт
7

Вы можете найти symlinksполезную утилиту:

$ symlinks -r .
other_fs: /home/chazelas/test/bin -> /bin
dangling: /home/chazelas/test/DIR/foo -> foo
dangling: /home/chazelas/test/blah -> not-here
absolute: /home/chazelas/test/chazelas -> /home/chazelas

И может исправить ссылки для вас. Вот, -tчтобы сказать, что он будет делать:

$ symlinks -rct .
other_fs: /home/chazelas/test/bin -> /bin
dangling: /home/chazelas/test/DIR/foo -> foo
dangling: /home/chazelas/test/blah -> not-here
absolute: /home/chazelas/test/chazelas -> /home/chazelas
changed:  /home/chazelas/test/chazelas -> ../../chazelas
Стефан Шазелас
источник