Kev*_*udé 6 linux command-line find which
如果我有一个以冒号分隔的路径列表,很像 $PATH,但不一定是 $PATH。
我想在该列表中搜索特定文件名。但是,我只想要第一个匹配的路径。
我已经考虑过以下 linux 命令:
which: 仅适用于二进制文件,并且仅适用于 $PATH 变量whereis: 适用于特定类型的文件,并且仅适用于 $PATH 变量find: 不支持以冒号分隔的路径列表,并返回多个结果以下是我尝试过的一些事情:
我尝试whereis通过以下策略使用
env WHEREIS="`which whereis`" PATH="$MY_PATH_LIST" $WHEREIS "$TARGET_FILE"
Run Code Online (Sandbox Code Playgroud)
这几乎有效。但是,它似乎不会返回任意文件类型的结果。它还以笨拙的格式返回多个结果。
我可以which上班
env WHICH="`which which`" PATH="$MY_PATH_LIST" $WHICH "$MY_TARGET_FILE"
Run Code Online (Sandbox Code Playgroud)
如果有一个命令行选项来强制它允许非可执行文件。
然后我尝试用find. 首先我使用正则表达式来扩展路径列表(我用空格替换冒号)。然后我调用find,它工作正常。但是,它会搜索所有路径。如果找到好的结果,我似乎无法找到一种方法来告诉它提前停止搜索。
我确实得到了这个工作
find ${MY_PATH_LIST//[:]/ } -name "$MY_TARGET_FILE" | head -n 1
Run Code Online (Sandbox Code Playgroud)
但需要很长时间才能完成,因为find仍在进行详尽的搜索。
我需要它更快地执行(在第一个结果时退出),因为它将使用不同的参数运行多次。
有没有人有更好的解决方案建议?
请注意,如果一切都失败了,我可以编写一个非 bash 解决方案。现在写我希望使用现有工具有一个简单的解决方案。
您可以使用一个脚本来简单地测试 ( -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
Run Code Online (Sandbox Code Playgroud)
例子:
$ ./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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1925 次 |
| 最近记录: |