Подтвердить что ты не робот

Как определить, нарушена ли символьная ссылка в Bash?

Я запускаю find и перебираю результаты с помощью [ \( -L $F \) ] для сбора определенных символических ссылок.

Мне интересно, есть ли простой способ определить, нарушена ли ссылка в этом сценарии.

Вот мой код:

FILES=`find /target/ | grep -v '\.disabled$' | sort`

for F in $FILES; do
    if [ -L $F ]; then
        DO THINGS
    fi
done
4b9b3361

Ответ 1

# test if file exists (test actual file, not symbolic link)
if [ ! -e "$F" ] ; then
    # code if the symlink is broken
fi

Ответ 2

Это должно печатать отловленные ссылки:

find /target/dir -type l ! -exec test -e {} \; -print

Вы также можете привязать операции к команде find, например. удаление неработающей ссылки:

find /target/dir -type l ! -exec test -e {} \; -exec rm {} \;

Ответ 3

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

Ответ 4

это будет работать, если символическая ссылка указывала на файл или каталог, но теперь нарушена

if [[ -L "$strFile" ]] && [[ ! -a "$strFile" ]];then 
  echo "'$strFile' is a broken symlink"; 
fi

Ответ 5

Если вы не против пересечения не-сломанных символических ссылок, найдите все осиротевшие ссылки:

$ find -L /target -type l | while read -r file; do echo $file is orphaned; done

Чтобы найти все файлы, которые не являются сиротами:

$ find -L /target ! -type l

Ответ 6

Это находит все файлы типа "link", который также разрешает тип "ссылка". то есть. сломанная символическая ссылка

find /target -type l -xtype l