Существует
ip route get 74.125.137.100
но это не делает разрешения сетевых имен (который я думаю, хорошая вещь). Команда обычно доступна от iproute или iproute2 пакетов.
С symlinks
утилита Mark Lord (предлагаемый многими дистрибутивами; если Ваш не имеет его, создают его из источника):
chroot /home/user/system symlinks -cr .
С другой стороны, в системах, которые имеют a readlink
команда и a -lname
предикат к find
(предупреждение: непротестированный код):
cd /home/user/system &&
find . -lname '/*' -exec ksh -c '
for link; do
target=$(readlink "$link")
link=${link#./}
root=${link//+([!\/])/..}; root=${root#/}; root=${root%..}
rm "$link"
ln -s "$root${target#/}" "$link"
done
' _ {} +
Этот отрывок удара должен сделать это. Первая форма распечатает то, что она сделала бы; второе сделает это. Я тщательно рассмотрел бы вывод, поскольку это является разрушительным - ln -f
перезаписывает существующую ссылку.
TOP=/home/user/system
cd $TOP
find * -type l -print | while read l; do echo ln -sf $TOP$(readlink $l) $l; done
find * -type l -print | while read l; do ln -sf $TOP$(readlink $l) $l; done
Вот чистое решение sh.
cd /home/user/system && find . -lname '/*' | while read l ; do echo ln -sf $(echo $(echo $l | sed 's|/[^/]*|/..|g')$(readlink $l) | sed 's/.....//') $l done | sh
Преобразование абсолютных ссылок в относительные поддерживается sshfs, который монтирует удаленные каталоги через ssh.
Команда :Там
sudo sshfs <remote_user>@<remote_ip_address>:/ /home/<host_user>/mntpoint/ -o transform_symlinks -o allow_other
Команда, особенно <placeholders>
, должна быть адаптирована к конкретной среде.
Чистый bash и coreutils, изменяет символические ссылки на относительные без лишних ../
s в пути:
find. -type l | while read l; do
target="$(realpath "$l")"
ln -fs "$(realpath --relative-to="$(dirname "$(realpath -s "$l")")" "$target")" "$l"
done
Вы можете изменить:
find.
в find /path/to/directory
для преобразования символических ссылок в этом каталоге ln -fs
по echo ln -fs
для пробного прогона Пояснение:
target="$(realpath "$l")"
-находит абсолютный путь к цели символической ссылки ln -fs
-создает символическую ссылку (-s
), заставляя(-f
)перезаписывать существующие realpath -s "$l"
-находит абсолютный путь к самой символической ссылке dirname "$(realpath -s "$l")"
-находит абсолютный путь к каталогу, содержащему символическую ссылку realpath --relative-to="$(dirname "$(realpath -s "$l")")" "$target"
-находит путь к цели относительно символической ссылки, другими словами :преобразует абсолютный путь в относительный find -lname "$PWD/*" | while read link ;do
target=$(readlink $link);
relative_target=$(realpath $target --relative-to=$link/.. --no-symlinks --canonicalize-missing);
ln --force --symbolic --no-target-directory $relative_target $link
done
"$PWD/*"
означает преобразование только абсолютных ссылок, которые указывают внутри текущего рабочего каталога
_ {} +
средний в конце находки? Кроме того, я получаю ошибкуfind: paths must precede expression: ksh
который, кажется, не имеет смысл (поскольку путь предшествует ksh выражению). – Alex 13.11.2013, 09:34_
$0
для отрывка оболочки, и{} +
заменяется списком аргументов, которые становятся$1
,$2
, и т.д., которыйfor link; do …
циклы по (это синонимично сfor link in "$@"; do …
). Ошибка отfind
происходит из-за опечатки (мне так или иначе удалось ввести одинарные левые кавычки вместо одинарных кавычек вокруг аргумента-lname
). – Gilles 'SO- stop being evil' 13.11.2013, 10:21symlinks
? Это решило бы Вашу проблему — это в основном, для чего это было разработано (с раздражением, которое необходимо выполнить, это chrooted (fakechroot должен добиться цели)). – Gilles 'SO- stop being evil' 13.11.2013, 12:00