按符号链接目标列出文件

mat*_*kie 24 find symlink

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

foo ->  /tmp/bar
bar ->  /home/me/bartoo
baz ->  /home/me/public/barthree
zoo ->  /usr/share/bar
moo ->  /tmp/foo
roc ->  /tmp/roc
Run Code Online (Sandbox Code Playgroud)

Cal*_*leb 32

您可以使用 find 获取所有符号链接类型的文件,并添加-ilname按链接目标名称搜索的选项。这就像-iname但是对于链接目标名称而不是链接名称一样。

find -type l -ilname "*bar*"
Run Code Online (Sandbox Code Playgroud)

这仍然会打印出链接的名称,而不是目标。如果要打印目标的名称,请尝试以下操作:

find -type l -ilname "*bar*" -printf "%l\n"
Run Code Online (Sandbox Code Playgroud)

或者得到一个完整的ls样式输出

find -type l -ilname "*bar*" -ls
Run Code Online (Sandbox Code Playgroud)

对列表做某事”是什么意思不清楚,但如果你想对链接文件进行操作,你可以使用-exec参数来查找:

find -type l -ilname "*bar*" -exec touch {} \;
Run Code Online (Sandbox Code Playgroud)

但是如果你需要对链接目标进行操作,你就需要使用-printf来获取目标值,然后xargs自己或者一些循环来操作。你可以这样做:

find -type l -printf "%l\n" | grep bar | xargs touch
Run Code Online (Sandbox Code Playgroud)

...这也演示了如何使用grep而不是进行find -ilname名称匹配,尽管您可以使用任何一种方式。