如何在 Bash 中的 $PATH 上找到文件?

Nei*_*ski 2 bash posix path

该实用程序which会在路径上找到一个程序,但是任意数据文件呢?

我一定是在寻找错误的东西,但我找不到任何使用标准实用程序来做到这一点的方法,所以我想写一个小 Bash 脚本来做到这一点。

$PATH环境变量由冒号分隔,但试图设置IFS=':',然后遍历结果是不是为我工作。这是我到目前为止所得到的:

IFS=':' DIRS=($PATH)
for d in $DIRS; do echo $d; done
Run Code Online (Sandbox Code Playgroud)

此时它只输出我路径中的第一个条目,而不是所有条目。

想法?如果已经有执行此操作的标准命令,则没有理由编写脚本......

Gil*_*not 6

使用这个,使用 bash参数扩展find

find ${PATH//:/\/ } -name 'file'
Run Code Online (Sandbox Code Playgroud)

  • 假设 PATH 中有一个目录,其中有一个空格。或者 PATH 中目录中的文件,文件名中有空格。 (4认同)
  • 您也没有扩展 *last* PATH 条目中的文件。 (2认同)
  • @GillesQuenot 我已经赞成你的“find”解决方案,因为我喜欢它_但是_当“$PATH”目录中存在空格时它不会工作 (2认同)

tri*_*eee 5

错误不在于赋值,而在于不循环数组。

IFS=: dirs=($PATH)
for dir in "${dirs[@]}"; do
    echo "$dir"
done
Run Code Online (Sandbox Code Playgroud)

为我工作;或者更简洁地说

printf '%s\n' "${dirs[@]}"
Run Code Online (Sandbox Code Playgroud)

就像您发现的那样,仅$dirs返回数组中的第一项。

要实际遍历这些目录寻找特定文件,也许可以尝试

desired_file_name=$1  # or whatever
for dir in "${dirs[@]}"; do
    test -e "$dir/$desired_file_name" || continue
    echo "$0: found $dir/$desired_file_name" >&2
done
Run Code Online (Sandbox Code Playgroud)

另一种方法是

find "${dirs[@]}" -name "$desired_file_name"
Run Code Online (Sandbox Code Playgroud)

(你的私有变量应该更喜欢小写,所以我改为DIRSdirs少喊叫对眼睛也有好处。)