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


10

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

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

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

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


1
Их называют «символическими ссылками» (в отличие от «жестких ссылок»).
Приостановлено до дальнейшего уведомления.

Правильно, я знал, что, возможно, я неправильно понял термин, спасибо за
заголовки

Софт-ссылка тоже хорошо, но с пробелом. :-) ( en.wikipedia.org/wiki/Symbolic_link )
Арджан,

Ответы:



14

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

находить . -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

Мне больше понравился ответ Полси, все еще +1 для вас, поскольку мне, возможно, придется сделать это вне сценария оболочки.
bguiz

1
Вам не обязательно нужны Xargs. Вы можете просто использовать найти. -maxdepth 1 -exec readlink {} \;
STIB

Правда, @stib, но xargsэто намного быстрее на моем Mac; см. мое редактирование Но я узнал что - то новое сегодня: есть также +вместо \;(Хотя некоторые утверждают , что это имеет / имел проблемы с grep.)
Арьян
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.