Выполненный apt-get update
и попробуйте еще раз. Это могло произойти, что подписи являются неправильными во время обновления репозитория.
Я могу предоставить вам фрагмент perl, чтобы сделать это для вас:
#!/usr/bin/perl
#
foreach my $i (@ARGV) {
# If it is a symlink then...
-l $i and do {
# First indirection; ensure that it exists and is not a link
my $j = readlink($i);
print "$i\n" if -e $j and ! -l $j
}
}
Если вы сохраните его как /usr/local/bin/if-link
и сделаете его исполняемым (chmod a+x /usr/local/bin/if-link
), вы можете использовать его следующим образом
/usr/local/bin/if-link * .*
Чтобы включить его в другой скрипт, вы можете использовать его как однострочный
perl -e 'foreach my $i (@ARGV) { -l $i && do { my $j = readlink($i); print "$i\n" if -e $j and ! -l $j } }' * .*
В дополнение к решениям, использующим Perl, я решил попытаться реализовать собственную мини-версию ReadLink, используя SYSCALL READLINK. Исходный код использования утилиты очень прост и выглядит так:
ret_length = readlink( argv[1], buffer, buffer_size );
if( ret_length >= 0 ) {
buffer[ ret_length ] = '\0';
printf( "%s\n", buffer );
return 0;
} else {
return errno;
}
скрипт Bash (./xrl - это имя утилиты; имена файлов, которые содержат Newline, не поддерживается):
USAGE="Usage: chl_xrl filename"
OLDIFS=$IFS
IFS=$'\n'
if [[ $# != 1 ]]
then
echo $USAGE
exit 1
fi
ls -1Au | while read -r pos; do
if [[ $(./xrl "$pos") == $1 ]]
then
echo "$pos"
fi
done
IFS=$OLDIFS
exit 0
Одно уточнение - скрипт принимает имя файла в качестве параметра и ищет прямой ссылки, но не для всех файлов в каталоге.