Как я могу определить, не сломана ли символическая ссылка в Bash? - PullRequest
43 голосов
/ 08 ноября 2011

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

Мне интересно, есть ли простой способ определить, не сломана ли ссылка (указывает на несуществующий файл) в этом сценарии.

Вот мой код:

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

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

Ответы [ 7 ]

44 голосов
/ 08 ноября 2011
# test if file exists (test actual file, not symbolic link)
if [ ! -e "$F" ] ; then
    # code if the symlink is broken
fi
30 голосов
/ 08 ноября 2011

Это должно распечатать ссылки, которые не работают:

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

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

find /target/dir -type l ! -exec test -e {} \; -exec rm {} \;
7 голосов
/ 08 ноября 2011

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
5 голосов
/ 05 мая 2014

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

if [[ -L "$strFile" ]] && [[ ! -a "$strFile" ]];then 
  echo "'$strFile' is a broken symlink"; 
fi
3 голосов
/ 24 мая 2014

Находит все файлы типа «ссылка», которые также разрешаются в тип «ссылка». то есть. битая символическая ссылка

find /target -type l -xtype l
2 голосов
/ 08 ноября 2011

Если вы не против перебрать неразорванные ссылки dir, найдите все потерянные ссылки:

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

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

$ find -L /target ! -type l
0 голосов
/ 31 мая 2019

Что не так с:

file $f | grep 'broken symbolic link'

...