按符号链接目标列出文件


23

如何通过筛选符号链接目标名称而不是符号链接名称来获取文件列表(然后对该列表执行某些操作)?例如,从下面的列表中,我仅对前四个文件(目标包含bar)感兴趣:

foo ->  /tmp/bar
bar ->  /home/me/bartoo
baz ->  /home/me/public/barthree
zoo ->  /usr/share/bar
moo ->  /tmp/foo
roc ->  /tmp/roc

Answers:


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名称匹配,尽管您可以通过任何一种方式进行匹配。


谢谢你,迦勒!您完全回答了我的紧迫问题,并涵盖了一些我肯定也会使用的旁道案例。
马特·威尔基2011年

1
任何想法为什么这find /dev/disk/ -type l -ilname "*sde*"不起作用?
Aquarius Power

需要GNU查找。
ceving 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.