Ответ 1
# test if file exists (test actual file, not symbolic link)
if [ ! -e "$F" ] ; then
# code if the symlink is broken
fi
Я запускаю find
и перебираю результаты с помощью [ \( -L $F \) ]
для сбора определенных символических ссылок.
Мне интересно, есть ли простой способ определить, нарушена ли ссылка в этом сценарии.
Вот мой код:
FILES=`find /target/ | grep -v '\.disabled$' | sort`
for F in $FILES; do
if [ -L $F ]; then
DO THINGS
fi
done
# test if file exists (test actual file, not symbolic link)
if [ ! -e "$F" ] ; then
# code if the symlink is broken
fi
Это должно печатать отловленные ссылки:
find /target/dir -type l ! -exec test -e {} \; -print
Вы также можете привязать операции к команде find
, например. удаление неработающей ссылки:
find /target/dir -type l ! -exec test -e {} \; -exec rm {} \;
readlink -q
не работает, если ссылка плохая:
for F in $FILES; do
if [ -L $F ]; then
if readlink -q $F >/dev/null ; then
DO THINGS
else
echo "$F: bad link" >/dev/stderr
fi
fi
done
это будет работать, если символическая ссылка указывала на файл или каталог, но теперь нарушена
if [[ -L "$strFile" ]] && [[ ! -a "$strFile" ]];then
echo "'$strFile' is a broken symlink";
fi
Если вы не против пересечения не-сломанных символических ссылок, найдите все осиротевшие ссылки:
$ find -L /target -type l | while read -r file; do echo $file is orphaned; done
Чтобы найти все файлы, которые не являются сиротами:
$ find -L /target ! -type l
Это находит все файлы типа "link", который также разрешает тип "ссылка". то есть. сломанная символическая ссылка
find /target -type l -xtype l