список файлов по символической ссылке

23

Как получить список файлов (а затем сделать что-то с этим списком), отфильтровав имя цели символической ссылки , а не имя символической ссылки? Например, из следующего списка меня интересуют только первые четыре файла (цель содержит bar):

foo ->  /tmp/bar
bar ->  /home/me/bartoo
baz ->  /home/me/public/barthree
zoo ->  /usr/share/bar
moo ->  /tmp/foo
roc ->  /tmp/roc
Мэтт Уилки
источник

Ответы:

31

Вы можете использовать find, чтобы получить все файлы типа symlink и добавить -ilnameопцию для поиска по имени назначения ссылки. Это работает так же, как и -inameдля целевого имени ссылки вместо имени ссылки.

find -type l -ilname "*bar*"

Это все равно распечатает имя ссылки, а не цель. Если вы хотите напечатать имена целей, попробуйте это:

find -type l -ilname "*bar*" -printf "%l\n"

Или получите полный lsстиль вывода

find -type l -ilname "*bar*" -ls

Что вы подразумеваете под « сделать что-то со списком », неясно, но если вы хотите работать с файлами ссылок, вы можете использовать -execаргумент для поиска:

find -type l -ilname "*bar*" -exec touch {} \;

Но если вам нужно работать с целевыми объектами ссылки, вам нужно будет использовать -printfцелевые значения для получения целевых значений, а затем xargsили какой-либо цикл самостоятельно. Вы могли бы сделать что-то вроде этого:

find -type l -printf "%l\n" | grep bar | xargs touch

... который также демонстрирует, как использовать grepвместо find -ilnameсопоставления вашего имени, хотя вы можете сделать это в любом случае.

Калеб
источник
спасибо Калеб! Вы полностью ответили на мой ближайший вопрос, а также рассмотрели некоторые случаи с побочными каналами, которые я обязательно буду использовать.
Мэтт Уилки
1
Любая идея, почему это find /dev/disk/ -type l -ilname "*sde*"не работает?
Водолей Power
Требуется GNU найти.
выступление