如何在环境变量中设置的目录列表中查找文件?

如何在环境变量中设置的目录列表中查找文件?

我正在尝试查找可能位于$LD_LIBRARY_PATH.基本上我正在尝试:

 find $LD_LIBRARY_PATH -name "*libdl*"

然而,上述命令失败,因为变量中有多个条目并将我的 a 分隔开:。我收到错误:

    No such file or directory

如何做到这一点?

答案1

您可以使用冒号进行分词,因为 *PATH 变量是用冒号分隔的目录列表。

取消注释以下行以保存并恢复旧的 IFS(推荐):

#oldIFS="$IFS"
IFS=:
set -o noglob # disable the glob part of the split+glob operator
              # unlikely to be needed as library directories
              # are unlikely to have wildcard characters in their
              # name.
find -H $LD_LIBRARY_PATH -mindpeth 1 -maxdepth 1 -name "*libdl*"
#IFS="$oldIFS"
#set +o noglob

-H如果这些组件中的任何一个是符号链接,则需要$LD_LIBRARY_PATH-mindepth 1(一个 GNU 扩展,尽管现在在许多其他实现中都可以找到)以避免这些组件本身的匹配,-maxdepth跳过在子目录中的搜索(这并不意味着由动态链接器搜索)。

Bash 简写假设默认值$IFS和 如果已知目录不包含该默认值的任何字符$IFS(空格、制表符和换行符)也不包含通配符,并且这些目录都不是符号链接也没有子目录,并且名称这些目录本身与模式不匹配:

find -H ${LD_LIBRARY_PATH//:/ } -name "*libdl*"

这使用了一个替换命令将每个冒号转换为一个空格(从 ksh93 复制的功能)。

使用zsh,无需做出任何这些假设:

print -rC1 - ${(s[:])^LD_LIBRARY_PATH}/*libdl*(ND)

相关内容