Вопрос или проблема
У меня есть большой набор каталогов и файлов, а также много символических ссылок, которые обычно указывают на каталог под названием “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
) могут быть доступны различные методы.
Эти подходы позволяют легко извлекать информацию о символических ссылках, не вдаваясь в сложности разбора выходных данных других команд. Вы можете выбрать наиболее подходящий для вас способ в зависимости от ваших требований и условий рабочего окружения.