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

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

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 .

  • Удалить файл, если символьная ссылка ушла
  • Является ли поведение chmod неправильным для символических ссылок?
  • Преобразование жесткой ссылки в символическую ссылку
  • Создание символических ссылок в каталоге etc без доступа root
  • «Ls -lH» не следует за ссылкой, но «ls -lH linktofile» после нее
  • Сопоставляет ли символическая ссылка с диска A на диск B на ввод-вывод на диске A?
  • undefined symbol: _ZN5boost15program_options11to_internalERKSs
  • Переключить символическую ссылку и каталог
  • 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 

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

    Interesting Posts

    Почему cron не работает автоматически?

    Двойная загрузка (Windows после Linux)

    Ограничение поддержки символов ZSH, поддерживающее повторение?

    Абсолютные имена доменов в / etc / hosts?

    systemd-ask-password Только подсказка на текущей консоли

    Проблемы с установкой вин в CentOS

    Установите с RPM, затем измените файлы. Как я могу видеть различия?

    Включение проводного интернет-соединения с dhcp во время установки Arch Linux?

    SSH: какой из них – мой открытый ключ

    Кто-нибудь действительно тестировал время автономной работы ноутбука под разными регуляторами процессора?

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

    Может ли Linux PC служить сетевым маршрутизатором?

    Не может быть Ping или Curl, но Nslookup работает

    Зарегистрировать всю корневую активность с оригинальным именем пользователя, которое su'd / sudoed для root

    Является ли AMD GPU FirePro достаточной для Linux Matlab и CUDA?

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