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

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

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 

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

  • Как найти PID цикла while?
  • копировать огромное количество файлов в дату упорядоченного заказа каталога
  • сначала скопируйте самые маленькие файлы?
  • В виртуальной виртуальной машине как установить права доступа к файловой системе?
  • Выполняет ли дочерний процесс fork оболочки в bg сигналы SIGSTOP от родителя?
  • очистить все переменные без закрытия терминала
  • Я работаю над Solaris 10. Нет команды readlink или stat . Команда find не имеет -printf .

  • Как я могу подсчитать количество строк файла с общими инструментами?
  • Сгладить вывод рекурсивного списка каталогов
  • команда tree в скрипте оболочки не добавляет слэши для каталогов
  • Отдельный файл bashrc для сеансов ssh, чтобы избежать ошибок Unison
  • Как преобразовать цветной файл в письмо, читаемое в bash?
  • Что вы собираетесь делать с вашими машинами OpenSolaris?
  • 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 - лучшая ОС в мире.