Перечислите прямые символьные ссылки (ссылки, которые не указывают на другую символьную ссылку),

Выполненный apt-get update и попробуйте еще раз. Это могло произойти, что подписи являются неправильными во время обновления репозитория.

3
23.04.2015, 14:14
2 ответа

Я могу предоставить вам фрагмент 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 } }' * .*
4
27.01.2020, 21:19

В дополнение к решениям, использующим 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

Одно уточнение - скрипт принимает имя файла в качестве параметра и ищет прямой ссылки, но не для всех файлов в каталоге.

0
27.01.2020, 21:19

Теги

Похожие вопросы