10

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

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

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

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

2 ответа2

14

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

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

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

find . -maxdepth 1 -type l -print

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

find . -maxdepth 1 -type l -exec ls -ld {} +
find . -maxdepth 1 -type l -print0 | xargs -0 ls -ld

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

find . -maxdepth 1 -exec readlink {} +
find . -maxdepth 1 -print0 | xargs -0 readlink

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

time find /usr/bin -maxdepth 1 -type l -exec ls -ld {} \;
real 0m0.372s
user 0m0.087s
sys  0m0.163s

time find /usr/bin -maxdepth 1 -type l -exec ls -ld {} +
real 0m0.013s
user 0m0.004s
sys  0m0.008s

time find /usr/bin -maxdepth 1 -type l -print0 | xargs -0 ls -ld
real 0m0.012s
user 0m0.004s
sys  0m0.009s

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .