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

8

Я часто перемещать деревья каталогов в другие места или копировать их тарболы к другим машинам, и я хотел бы иметь метод , чтобы проверить , является ли какие - либо символические ссылки в виде дерева каталогов A точки за пределы сети А поскольку они будут разбиты в движущееся / скопировано каталог.

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

Ответы:

7

Вы хотите, чтобы программа называлась realpathи использовалась вместе с find.

Например:

find . -type l -exec realpath {} \; | grep -v "^$(pwd)"
bahamat
источник
1
Предоставляемое вами заклинание сообщает только о неверном целевом местоположении, а не о символической ссылке, которая на него указывает. Таким образом, я снял свое согласие. Пожалуйста, смотрите мой «ответ» ниже: unix.stackexchange.com/a/308899/24044, и если вы довольны (или улучшаете его), я удалю свой «ответ» и снова приму ваш вопрос.
Маркус Юний Брутус
2

Используйте bindfs для создания другого представления этого дерева каталогов.

mkdir /tmp/view
bindfs /some/directory /tmp/view

Затем используйте утилиту symlinks (поставляется во многих дистрибутивах или скомпилируйте ее из исходного кода ) для обнаружения ссылок между файловыми системами.

symlinks -r /tmp/view | sed -n 's/^\(absolute\|other_fs\): //p'

(Обратите внимание, что при анализе выходных данных предполагается, что ваши символические ссылки и их цели не содержат новых строк, а пути к символическим ссылкам не содержат подстроку  -> .) Эта же утилита может также преобразовывать абсолютные символические ссылки в относительные (но вы должны сделать это из исходное местоположение).

Жиль "ТАК - перестань быть злым"
источник
2

С зш:

cd -P -- "$dir"
for i (**/*(ND@)) [[ $i:A = $PWD/* ]] || [[ $i:A = $PWD ]] || print -r -- "$i => $i:A"

Теперь, если каталог есть, /fooи у вас есть /foo/barсимволическая ссылка /foo/baz, это ссылка, цель которой находится в / foo, но после перемещения ссылка все равно будет разорвана, поэтому вы можете также захотеть сопоставить символические ссылки с абсолютными путями.

Но даже bar => ../foo/bazв /fooэтом случае проблема может быть связана с ошибкой (ложноотрицательным), а символическая ссылка a => bwhere bвне дерева (ложно-положительная, в зависимости от того, как вы хотите на нее смотреть)

Стефан Шазелас
источник
2

Мне пришлось немного подправить ответ @bahamat, чтобы он заработал.

Предоставленная версия просто сообщает об оскорбительном абсолютном местоположении, но не символическую ссылку, которая указывает на него.

Вот что я использовал (я уверен, что это можно улучшить):

for f in $(find . -type l ); do echo -n $(realpath $f) && echo -n "|" && echo $f ; done | grep -v "^$(pwd)" | cut -d \| -f 2 
Маркус Юний Брут
источник
Я нашел , что это самый полезный скрипт: for f in $(find . -type l); do echo $(realpath -m -q $f) '<-' $f; done | grep-v "^$(pwd)"( в первую очередь -mи -qкакие фильтры из разбитых и не внешних ссылок)
Adam Lindberg
1

GNU coreutils проверяет realpath, который разрешает символические ссылки . При этом вы можете сравнить цель каждой символической ссылки с текущим рабочим каталогом примерно так:

#!/bin/bash

find . | while read filename
do
  if realpath $filename | grep -E "^$PWD" > /dev/null
  then
    echo 'this file is safe'
  else
    echo 'this file links externally'
  fi
done
колоны
источник
Несколько проблем: нет -type l, нет -rвозможности read, IFS не очищается read, $filenameне цитируется, $PWDрассматривается как регулярное выражение, пути с символами новой строки, не учитываемыми, /foobarбудут сопоставляться для $PWD== "/ foo"
Стефан Шазелас