Как найти и перечислить все символические ссылки в короткой форме?

Вопрос или проблема

У меня есть большой набор каталогов и файлов, а также много символических ссылок, которые обычно указывают на каталог под названием “shared” или на каталог или файл внутри каталога “shared”.

Вот представление:

$ ls -lR
total 0
drwxr-xr-x  5 myself  staff  160 Oct 11 11:54 a
drwxr-xr-x  5 myself  staff  160 Oct 11 11:55 b

./a:
total 0
lrwxr-xr-x  1 myself  staff  2 Oct 11 11:54 a2 -> a1
lrwxr-xr-x  1 myself  staff  2 Oct 11 11:54 a3 -> a2
lrwxr-xr-x  1 myself  staff  2 Oct 11 11:54 a4 -> a3

./b:
total 0
lrwxr-xr-x  1 myself  staff  2 Oct 11 11:54 b1 -> b2
lrwxr-xr-x  1 myself  staff  2 Oct 11 11:54 b2 -> b3
lrwxr-xr-x  1 myself  staff  2 Oct 11 11:55 b3 -> b4

Если я использую find -type l для перечисления символических ссылок, я получаю этот длинный вывод:

$ find . -type l -ls
14800041 0 lrwxr-xr-x 1 myself staff 2 Oct 11 11:54 ./a/a4 -> a3
14800032 0 lrwxr-xr-x 1 myself staff 2 Oct 11 11:54 ./a/a3 -> a2
14799990 0 lrwxr-xr-x 1 myself staff 2 Oct 11 11:54 ./a/a2 -> a1
14800060 0 lrwxr-xr-x 1 myself staff 2 Oct 11 11:54 ./b/b2 -> b3
14800061 0 lrwxr-xr-x 1 myself staff 2 Oct 11 11:55 ./b/b3 -> b4
14800046 0 lrwxr-xr-x 1 myself staff 2 Oct 11 11:54 ./b/b1 -> b2

Если я делаю рекурсивный вывод с помощью ls -lR, я получаю аналогичный вывод.

Мне нужны только два элемента в моём выводе – имя символической ссылки и то, на что она указывает, разделённые ->. Как я могу получить этот вывод, не используя фильтры для разбора вывода ls или find?

Вы можете попробовать

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

Или если -printf недоступен, вы также можете попробовать

find . -type l -exec sh -c 'for link; do echo "$link -> $(readlink "$link")"; done' sh {} +

С оболочкой zsh:

zmodload zsh/stat
stat -nA links +link -- **/*(D@)
printf '%s -> %s\n' $links

.

Ответ или решение

Чтобы найти и перечислить все символические ссылки в системе, не прибегая к сложной фильтрации вывода команд ls или find, можно воспользоваться следующими методами. В данной статье мы рассмотрим несколько эффективных способов, которые позволят вам получить необходимый результат — имена символических ссылок и целевые пути, на которые они указывают, с разделителем ->.

Способ 1: Использование команды find с опцией -printf

Если у вас есть возможность использовать опцию -printf, данный метод является наиболее простым и удобным:

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

Здесь:

  • . — указывает на текущий каталог, в котором будет производиться поиск.
  • -type l — фильтрует только символические ссылки.
  • -printf '%p -> %l\n' — выводит путь к символической ссылке (%p) и путь, на который она указывает (%l), разделенные стрелкой.

Способ 2: Использование find с командой -exec

Если опция -printf недоступна в вашей версии find, вы можете использовать команду -exec для выполнения команды sh, которая обрабатывает вывод и форматирует его:

find . -type l -exec sh -c 'for link; do echo "$link -> $(readlink "$link")"; done' sh {} +

Здесь:

  • -exec sh -c '...' — позволяет выполнить команды оболочки для каждой найденной ссылки.
  • readlink "$link" — чтение целевого пути символической ссылки.

Способ 3: Использование оболочки zsh

Если вы используете zsh, есть ещё один метод, который позволяет получить список символических ссылок с помощью встроенных функций:

zmodload zsh/stat
stat -nA links +link -- **/*(D@)
printf '%s -> %s\n' $links

В данном случае:

  • zmodload zsh/stat — загружает модуль для работы со статистикой файлов.
  • stat -nA links +link -- **/*(D@) — собирает все символические ссылки в массив links.
  • printf '%s -> %s\n' $links — выводит имена символических ссылок и на что они указывают.

Заключение

Одним из наиболее эффективных способов нахождения и перечисления символических ссылок является использование команды find с опцией -printf. В случае недоступности этой опции можно использовать команду -exec для обработки названий символических ссылок. Не забывайте, что в зависимости от вашей среды (например, bash или zsh) могут быть доступны различные методы.

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

Оцените материал
Добавить комментарий

Капча загружается...