Linux:从指定的搜索路径中查找第一个结果


5

如果我有一个冒号分隔的路径列表,很像$ PATH,但不一定是$ PATH。

我想在该列表中搜索特定的文件名。但是,我只想要第一个匹配的路径。

我考虑过以下linux命令:

  • which:仅适用于二进制文件,仅适用于$ PATH变量
  • whereis:适用于特定类型的文件,仅适用于$ PATH变量
  • find:不支持冒号分隔的路径列表,并返回多个结果

以下是我尝试过的一些事情:

  1. 我试图whereis通过以下策略使用

    env WHEREIS="`which whereis`" PATH="$MY_PATH_LIST" $WHEREIS "$TARGET_FILE"
    

    这几乎可行。但是,它似乎没有返回任意文件类型的结果。它还会以笨拙的格式返回多个结果。

  2. 我可以which上班

    env WHICH="`which which`" PATH="$MY_PATH_LIST" $WHICH "$MY_TARGET_FILE"
    

    如果有一个命令行选项强制它允许非可执行文件。

  3. 然后我尝试解决问题find。首先,我使用正则表达式来扩展路径列表(我用空格替换冒号)。然后我调用find,它正常工作。但是,它会搜索所有路径。如果找到一个好的结果,我似乎无法找到一种方法告诉它尽早停止搜索。

    我确实让这个工作了

     find ${MY_PATH_LIST//[:]/ } -name "$MY_TARGET_FILE" | head -n 1
    

    但它需要很长时间才能完成,因为find仍在进行详尽的搜索。

    我需要这个更快地执行(退出第一个结果),因为它将运行多次,具有不同的参数。

有人有更好的解决方案吗?

请注意,如果全部失败,我可以编写非bash解决方案。现在写我希望使用现有工具的简单解决方案。

Answers:


3

您可以只使用一个脚本来测试(-e)是否存在文件,并在找到第一个文件时停止:

#!/bin/bash
[[ $# -gt 0 ]] || { echo "Usage: $0 <filename> [pathspec]" >&2 ; exit 1 ; }
if [[ $# -gt 1 ]] ; then
        P="$2"
else
        P="$PATH"
fi

IFS=:
for DIR in $P ; do
        if [[ -e "$DIR/$1" ]] ; then
                echo "$DIR/$1"
                exit 0
        fi
done

例:

$ ./search.sh 
Usage: ./search.sh <filename> [pathspec]

$ ./search.sh ls
/Users/danielbeck/bin/ls

$ ./search.sh pwd
/bin/pwd

$ ./search.sh ls /bin
/bin/ls

$ ./search.sh ls /usr/bin:/bin
/bin/ls

谢谢,丹尼尔。这有效。我很惊讶没有为此目的的内置命令。我要稍等一下,看看是否有任何有趣的评论。到目前为止,看起来这个将会发给你。:-)
KevinA.Naudé12年

0

使用head获取find命令的第一个结果。

find `echo colon:separated:directories | sed 's/:/ /g'` -name filename | head -n1

或者在一个功能中:

$ function findin { find `echo $1 | sed 's/:/ /g'` -name $2 | head -n1; }
$ findin this:that:other filename
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.