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

wan*_*r95 3 bash find

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

 find $LD_LIBRARY_PATH -name "*libdl*"
Run Code Online (Sandbox Code Playgroud)

但是,由于变量中有多个条目并且将我的 a 分开,上述命令失败:。我收到错误:

    No such file or directory
Run Code Online (Sandbox Code Playgroud)

如何做到这一点?

Qua*_*odo 7

您可以使用带冒号的分词,因为 *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
Run Code Online (Sandbox Code Playgroud)

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

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

find -H ${LD_LIBRARY_PATH//:/ } -name "*libdl*"
Run Code Online (Sandbox Code Playgroud)

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

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

print -rC1 - ${(s[:])^LD_LIBRARY_PATH}/*libdl*(ND)
Run Code Online (Sandbox Code Playgroud)

  • 关于恢复`IFS`,也可以使用子shell:`(IFS=:; find $LD_LIBRARY_PATH -name "*libdl*")` (2认同)