如何打印使用共享库的目录中的所有库?

如何打印使用共享库的目录中的所有库?

如何打印使用共享库 (mylibrary) 的目录中的所有库?我试过:

ldd /usr/mt-60/apl/651/*.so |grep libmylibrary

但输出没有库名:

    libmylibrary.so => /usr/aaa/libmylibrary.so (0x40017000)
    libmylibrary.so => /usr/aaa/libmylibrary.so (0x40016000)

答案1

find /usr/mt-60/apl/651/*.so -exec sh -c 'ldd "$1" | grep -q libmylibrary' sh {} \; -print

诀窍-exec也是 中的测试find。在这种情况下,它测试 的退出状态sh是 的退出状态grep;因此,-print只有grep找到任何内容时才会起作用。

笔记:

  • 我们需要sh内心使内管工作
  • 这里所有路径都以 开头/usr/mt-60/apl/651/,因此不会有看起来像选项的路径(例如-L)。一般来说,如果有这样的路径,您可能希望使用find -- …和。如果您的模式以或或文字开头,这将是相关的(处理这种不方便的模式的另一种方法是将其添加到前面)。ldd -- …*?-./
  • 通配符*由(外部)外壳扩展,一般在find之前会获得多个参数-exec。这可能导致argument list too long(或no such file or directory如果没有匹配)。因此,您可能需要find进行匹配:

    find /usr/mt-60/apl/651/ -type f -name "*.so" …
    

    哪里*不是由于被引用,因此由 shell 展开。请注意,此方法是递归的(请调查-maxdepth或参阅这个问题如果这是个问题的话)。

  • 忽略-q以查看输出grep 相应文件的路径。

相关内容