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

32598
bguiz

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

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

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

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

10
Их называют «символическими ссылками» (в отличие от «жестких ссылок»). Dennis Williamson 14 лет назад 1
Правильно, я знал, что, наверное, неправильно понял термин, спасибо за заголовки bguiz 14 лет назад 0
Мягкая ссылка тоже хорошо, но с пробелом. :-) (http://en.wikipedia.org/wiki/Symbolic_link) Arjan 14 лет назад 0

2 ответа на вопрос

14
Polsy

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

for file in * do if [ -h "$file" ]; then echo "$file" fi done 
http://www.faqs.org/docs/bashman/bashref_68.html - условные выражения лучше читаются, чем справочная страница. Manos Dilaverakis 14 лет назад 2
Спасибо @Polsy и @Manos! `test -h` это то, что я хотел! bguiz 14 лет назад 0
14
Arjan

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

находить . -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 14 лет назад 0
Вам не обязательно нужны Xargs. Вы можете просто использовать поиск. -maxdepth 1 -exec readlink {} \; stib 12 лет назад 1
Да, @stib, но `xargs` намного быстрее на моем Mac; см. мое редактирование. Но сегодня я узнал что-то новое: вместо `\;` также есть `+` (хотя некоторые утверждают, что [с этим возникли проблемы) (http://www.sunmanagers.org/pipermail/summaries/2005-March/006255 .html) с `grep`.) Arjan 12 лет назад 0
интересно. спасибо, что поделились этим. stib 12 лет назад 0