Список символических ссылок в текущем каталоге?

8

Этот вопрос говорит о поиске каталогов в текущем каталоге. Решение в основном:

ls -d */

Это здорово, но как я могу легко перечислить символические ссылки? Должен ли я использовать что-то вроде

find . -xtype l -d 1
(intended to find symlinks max depth 1 - doesn't work)

Или есть более простой способ? Можно ли использовать для этого?

УХО
источник
В моей системе Ubuntu, быстрый взгляд на его man findшоу, который -dявляется синонимом -depth(для совместимости с FreeBSD, NetBSD, MacOS X и OpenBSD.), Т.е. это не то же самое, что -maxdepth. , , -depth Обработайте содержимое каждого каталога перед самим каталогом
Peter.O

Ответы:

9

В zsh (добавить Nв скобки, чтобы включить символические ссылки, имя которых начинается с a .):

echo *(@)

С большинством findреализаций:

find -maxdepth 1 -type l

POSIX-совместимый:

find . -type d \! -name . -prune -o -type l -print

Или с петлей оболочки:

for x in * .*; do
  if [ -h "$x" ]; then echo "$x"; done
done
Жиль "ТАК - перестань быть злым"
источник
1
Для -pruneварианта вам необходимо использовать find topdir ! -name topdir -prune; в противном случае начальный каталог также игнорируется.
Arcege
6

Это не на Mac, но

find . -maxdepth 1 -type l

работает для меня.

frogstarr78
источник
3

Вы должны использовать, -typeа не -xtype:

   -xtype c
          The same as -type unless the file is a symbolic link.  For  sym‐
          bolic  links:  if the -H or -P option was specified, true if the
          file is a link to a file of type c; if the -L  option  has  been
          given,  true  if  c is `l'.  In other words, for symbolic links,
          -xtype checks the type of the file that -type does not check.

По умолчанию используется значение -P, поэтому параметр -xtype будет пытаться определить результирующий файл, а не саму символическую ссылку. На самом деле, я получаю некоторые положительные результаты, что похоже на ошибку. -P -xtype lДолжна возвращать верно (на линке) тогда и только тогда результирующая само по себе является символической ссылкой.

Можно также использовать: ls -FA | sed -ne 's/@//p'который будет отображать только символические ссылки.

Arcege
источник
Отличное
2
sed -ne 's/@//p'(и даже sed -ne 's/@$//p') не является безопасным тестом, так как первая версия выдаст ложное срабатывание, когда @происходит где-либо в выводе ls , а вторая вернет ложное положительное значение, когда имя файла действительно заканчивается@
Peter.O
1

Чтобы узнать только файлы, которые являются символическими ссылками в текущем каталоге:

find . -type l -printf '%p -> %l\n'

Это будет рекурсивно перечислять все файлы символических ссылок. Кроме того, он показывает фактические файлы, на которые он указывает.

periwinkle1
источник