Как найти все программные ссылки (символические ссылки) в текущем каталоге?

Вопрос касается shell-скриптинга в bash,

Как проверить с помощью скрипта, какие файлы в текущем каталоге являются программными ссылками?

Если я использовал неправильный термин, когда я говорю мягкие ссылки, я имею в виду файлы, созданные с использованием ln -s,

Единственное, что мне удалось придумать, - это оценить ls -la в качестве выражения, и проанализировать его результаты, но, очевидно, это не лучшее решение.

2 ответа

Решение

Смотрите "УСЛОВНЫЕ ВЫРАЖЕНИЯ" в man bash - в этом случае вы хотите -h:

for file in *
do
  if [ -h "$file" ]; then
    echo "$file"
  fi
done

Возможно, вам не нужен сценарий. Чтобы показать любые символические ссылки только в текущей папке, не возвращаясь ни в одну дочернюю папку:

 находить. -maxdepth 1-type l -print 

Или, чтобы получить больше информации, используйте один из:

 находить. -maxdepth 1 -тип l -exec ls -ld {} +
находить. -maxdepth 1 -type l -print0 | xargs -0 ls -ld 

Чтобы определить, является ли файл символической ссылкой, можно использовать readlink, который ничего не выдаст, если это не символическая ссылка. Следующий пример не совсем полезен, но показывает, как readlink игнорирует нормальные файлы и папки. Используйте один из:

 находить. -maxdepth 1 -exec readlink {} +
находить. -maxdepth 1 -print0 | xargs -0 readlink 

Обратите внимание, что выше -exec ... + а также xargs ... намного быстрее чем -exec ... \;, Подобно:

 time find /usr/bin -maxdepth 1 -type l -exec ls -ld {} \;
реальный 0m0,372s
пользователь 0m0.087s
sys 0m0.163s

time find /usr/bin -maxdepth 1 -type l -exec ls -ld {} +
реальный 0m0.013s
пользователь 0m0.004s
sys  0m0.008s

время найти /usr/bin -maxdepth 1 -тип l -print0 | xargs -0 ls -ld
реальный 0m0.012s
пользователь 0m0.004s
sys  0m0.009s 
Другие вопросы по тегам