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

Мне нужно составить список всех прямых символических ссылок в каталоге, то есть символических ссылок, указывающих на другой файл, который не является символической ссылкой.
Я попытался сделать это так:

for i in $(ls -1A); do first_type=$(ls -l $i | cut -b 1) if [ $first_type == 'l' ] then next=$(ls -l $i | awk '{print $NF}') next_type=$(ls -l $next | cut -b 1) if [ $next_type != 'l' ] then #Some code fi fi done 

Но в этом случае скрипт пропускает файлы, чьи имена имеют пробелы / табуляции / новые строки (в том числе в начале и в конце имени файла). Есть ли способ решить это?

Я работаю над Solaris 10. Нет команды readlink или stat . Команда find не имеет -printf .

  • Должен ли я использовать жесткие ссылки для моей «привязанной к сайтам» папки вместо программных ссылок?
  • Может ли жесткая связь нарушить структуру файловой системы?
  • Переход в каталог, связанный ссылкой
  • Могут ли символические ссылки охватывать разные файловые системы в Unix или Linux?
  • В чем разница между жесткой ссылкой и файлом?
  • Символы, не работающие с плавким предохранителем GlusterFS
  • Связывание дома пользователя с другим диском
  • Как получить список всех «псевдонимов» файла (включая каталог типов) эффективно?
  • 2 Solutions collect form web for “Перечислите прямые символические ссылки (ссылки, которые не указывают на другую символическую ссылку)”

    Я могу предоставить вам фрагмент 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, используя системный вызов 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 script (./xrl – имя утилиты; имена файлов, содержащие новую строку, не поддерживаются):

     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 

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

    Linux и Unix - лучшая ОС в мире.