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

Вопрос касается сценариев оболочки в bash.

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

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

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

10
задан 17.11.2009, 14:24

2 ответа

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

for file in *
do
  if [ -h "$file" ]; then
    echo "$file"
  fi
done
14
ответ дан 07.12.2019, 12:36

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

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
14
ответ дан 07.12.2019, 12:36

Теги

Похожие вопросы