在我的PATH环境变量中查找包含特定字符串的可执行文件。

5
有没有一种快速的方法可以知道我的$PATH中可执行文件是否包含特定的字符串?例如,我想快速列出包含SRA的可执行文件。
我问这个问题的原因是我有几个带有字符SRA的脚本。问题是我总是忘记文件的起始字符(如果我记得,我使用tab键自动补全来查找)。
4个回答

2
您可以将所有路径存储在一个数组中,然后使用find及其各种选项:
IFS=":" read -ra paths <<< "$PATH"
find "${paths[@]}" -type f -executable -name '*SRA*'
  • IFS=":" read -ra paths <<< "$PATH" 读取所有路径到一个数组中,将字段分隔符暂时设置为:,就像在Setting IFS for a single statement中所看到的那样。
  • -type f 查找文件。
  • -executable 查找可执行文件。在OSX中,您可以使用-perm +111替代 (source)。

由于FreeBSD或OSX不支持-executable选项,因此ghoti推荐使用-perm选项:

find -perm -o=x,-g=x,-u=x

为什么要用循环?为什么不直接使用 find "${paths[@]}" -type f ... 呢? - ghoti
1
很高兴能够为您的一个答案做出贡献。 :) - ghoti
2
没错,如果没有-ls-exec参数,-print将是默认选项。不过需要提醒的是,在FreeBSD或OSX中,find命令并不包含-executable选项,该选项是GNU findutils才有的。但我相信你可以使用-perm +u=x,g=x,o=x来达到同样的效果。 - ghoti
1
另一个可能的更改是忽略来自查找的错误(因为PATH中的某些路径可能无效),并删除重复项(因为某些路径可能在路径中出现多次),因此 find "${paths[@]}" -type f -executable -name *SRA*' 2>/dev/null | sort | uniq - Brad Parks
1
还有一种方法,听起来像是-executable的POSIX可移植版本,就是使用-perm +111,这是我在Mac上唯一能够正常工作的变体,来源于这里 - Brad Parks
显示剩余16条评论

1

例如:

find ${PATH//:/ } -maxdepth 1 -executable -name '*SRA*'

如果您的$PATH(或其他有害字符)中包含空格,则可以使用@fedorqui答案中借用的<<<技巧:

tr ":\n" "\\000" <<< "$PATH" | \
  xargs -0r -I{} -n1 find {} -maxdepth 1 -executable -name '*SRA*'

它还可以正确处理空的 $PATH。

同样的弱点也存在,就是在包含空格的路径目录周围失败... 使用 IFS=: 的解决方案更加安全。 - ghoti

0
有点笨拙:
find $(echo $PATH | tr : ' ') -name \*SRA\*

-1
我编写了一个Bash脚本,在这个页面上基于这个很棒的答案,可以对OSX进行包装。
我认为它也适用于其他操作系统。请注意它还会忽略错误,对结果进行排序,并且仅显示唯一值!

executables_in_path_matching_substring.sh

#!/usr/bin/env bash
function show_help()
{
  ME=$(basename "$0")
  IT=$(cat <<EOF

  returns a list of files in the path that match a substring

  usage: $ME SUBSTRING

  e.g.

  # Find all files in the path that have "git" in their name
  $ME git
EOF
)
  echo "$IT"
  echo
  exit
}

if [ -z "$1" ]
then
  show_help
fi
if [ "$1" == "help" ] || [ "$1" == '?' ] || [ "$1" == "--help" ] || [ "$1" == "h" ]; then
  show_help
fi

SUBSTRING="$1"
IFS=":" read -ra paths <<< "$PATH"
find "${paths[@]}" -type f -perm +111 -name "*$SUBSTRING*" 2>/dev/null | sort | uniq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接