Как искать неработающие ссылки во всей локальной файловой системе сервера?
Я должен сделать это в korn, потому что bash не установлен. Пока это мой сценарий, но он не совсем работает, как я ожидаю.
cd /
find . -xdev -type d > /tmp/dirlist
export YOURLIST=`cat /tmp/dirlist2`
echo START > /tmp/final
for a in $YOURLIST; do
export MYLIST=`ll $a | grep "\->" | awk '{print $11;}'`
echo in dir $a >> /tmp/final
sleep 5
for b in $MYLIST; do
echo `ll $b` 2>&1 > /tmp/result
grep -q not /tmp/result
export RC=$?
if [ "$RC" = "0" ]
then
cat /tmp/result >> /tmp/final
fi
done
done
В настоящее время это только печатные каталоги /tmp/final
и он по-прежнему отображает не найденные сообщения stdout
достаточно странно.
2 ответа
Решение
Сделал двойную вещь, чтобы смоделировать то, что отсутствовало в ответе Гленна
root@system:/ $ cat /bin/checklink
export ORIGINAL=`ll $1 | awk '{print $9;}'`
export ORIGINALDIR=`dirname $ORIGINAL`
export LINKIS=`ll $1 | awk '{print $11;}'`
export FOUND="0"
if [ -d ${ORIGINALDIR}/${LINKIS} ]
then
export FOUND="1"
else if [ -f ${ORIGINALDIR}/${LINKIS} ]
then
export FOUND="2"
else if [ -d ${LINKIS} ]
then
export FOUND="3"
else if [ -f ${LINKIS} ]
then
export FOUND="4"
fi
fi
fi
fi
if [ "$FOUND" = "0" ]
then
echo $1 pointing to $LINKIS not found
fi
Затем следует звонок
`find / -xdev -type l -exec checklink {} \;
Не стесняйтесь улучшать...
find
должен быть в состоянии найти символические ссылки, вам не нужно прибегать к анализуls
,
find / -xdev -type l -print |
while IFS= read -r f; do
target=$(readlink "$f")
[[ -e "$target" ]] || echo "broken symlink: $f -> $target"
done