Я часто перемещать деревья каталогов в другие места или копировать их тарболы к другим машинам, и я хотел бы иметь метод , чтобы проверить , является ли какие - либо символические ссылки в виде дерева каталогов A точки за пределы сети А поскольку они будут разбиты в движущееся / скопировано каталог.
8
Используйте bindfs для создания другого представления этого дерева каталогов.
Затем используйте утилиту symlinks (поставляется во многих дистрибутивах или скомпилируйте ее из исходного кода ) для обнаружения ссылок между файловыми системами.
(Обратите внимание, что при анализе выходных данных предполагается, что ваши символические ссылки и их цели не содержат новых строк, а пути к символическим ссылкам не содержат подстроку
->
.) Эта же утилита может также преобразовывать абсолютные символические ссылки в относительные (но вы должны сделать это из исходное местоположение).источник
С зш:
Теперь, если каталог есть,
/foo
и у вас есть/foo/bar
символическая ссылка/foo/baz
, это ссылка, цель которой находится в / foo, но после перемещения ссылка все равно будет разорвана, поэтому вы можете также захотеть сопоставить символические ссылки с абсолютными путями.Но даже
bar => ../foo/baz
в/foo
этом случае проблема может быть связана с ошибкой (ложноотрицательным), а символическая ссылкаa => b
whereb
вне дерева (ложно-положительная, в зависимости от того, как вы хотите на нее смотреть)источник
Мне пришлось немного подправить ответ @bahamat, чтобы он заработал.
Предоставленная версия просто сообщает об оскорбительном абсолютном местоположении, но не символическую ссылку, которая указывает на него.
Вот что я использовал (я уверен, что это можно улучшить):
источник
for f in $(find . -type l); do echo $(realpath -m -q $f) '<-' $f; done | grep-v "^$(pwd)"
( в первую очередь-m
и-q
какие фильтры из разбитых и не внешних ссылок)GNU coreutils проверяет
realpath
, который разрешает символические ссылки . При этом вы можете сравнить цель каждой символической ссылки с текущим рабочим каталогом примерно так:источник
-type l
, нет-r
возможностиread
, IFS не очищаетсяread
,$filename
не цитируется,$PWD
рассматривается как регулярное выражение, пути с символами новой строки, не учитываемыми,/foobar
будут сопоставляться для$PWD
== "/ foo"