список файлів за цільовим символьним посиланням


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щоб робити відповідність вашого імені, хоча ви могли це зробити так чи інакше.


дякую, Калеб! Ви повністю відповіли на моє безпосереднє запитання, а також висвітлювали деякі випадки бічних каналів, які я неодмінно також використовую.
matt wilkie

1
будь-яка ідея, чому це find /dev/disk/ -type l -ilname "*sde*"не працює?
Сила Водолія

Потрібен GNU-пошук.
закінчення
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.