Bash 使用特定字符串查找路径中的可执行文件

Bash 使用特定字符串查找路径中的可执行文件,bash,shell,Bash,Shell,有没有办法快速知道my$PATH中的可执行文件是否包含特定字符串?例如,我想快速列出包含SRA的可执行文件 我问这个问题的原因是我有几个脚本,其中包含字符SRA。问题是我总是忘记文件的起始字符(如果我记得的话,我使用制表符补全来查找它)。例如: find ${PATH//:/ } -maxdepth 1 -executable -name '*SRA*' 如果在$PATH中碰巧有空格(或其他危险字符)(有点笨拙: find $(echo $PATH | tr : ' ') -name \*SR

有没有办法快速知道my
$PATH
中的可执行文件是否包含特定字符串?例如,我想快速列出包含
SRA
的可执行文件

我问这个问题的原因是我有几个脚本,其中包含字符
SRA
。问题是我总是忘记文件的起始字符(如果我记得的话,我使用制表符补全来查找它)。

例如:

find ${PATH//:/ } -maxdepth 1 -executable -name '*SRA*'
如果在$PATH中碰巧有空格(或其他危险字符)(
有点笨拙:

find $(echo $PATH | tr : ' ') -name \*SRA\*

您可以将所有路径存储在一个数组中,然后使用
find
及其各种选项:

IFS=":" read -ra paths <<< "$PATH"
find "${paths[@]}" -type f -executable -name '*SRA*'

我在这一页上为OSX编写了一个bash脚本

我认为它也适用于其他操作系统。请注意,它也会忽略错误,对结果进行排序,并且只显示唯一的值

可执行文件\u在\u路径\u匹配\u substring.sh中
!/usr/bin/env bash
函数show_help()
{
ME=$(基本名称“$0”)

IT=$(为什么要循环?为什么不只
查找“${paths[@]}”-键入f…
?很高兴能够为您的答案之一做出贡献。:)啊,没错,
-print
是默认值,如果没有
-ls
-exec
。不过,作为参考,FreeBSD或OSX中的
查找
不包括
-executable
选项,这是GNU findutils选项。我相信您可以使用
-perm+u=x,g=x,o=x
获得相同的结果。他还提出了另一个可能的更改re是忽略查找中的错误(因为路径中的某些路径可能无效),并删除重复项(因为某些路径可能多次出现在路径中),因此
find“${paths[@]}”-键入f-executable-name*SRA*'2>/dev/null | sort | uniq
和另外一个,听起来像是posix便携式版本的
-executable
,就是使用
-perm+111
,这是我可以在mac上使用的唯一变体,同样的缺点是绕过包含空格的路径目录…一个使用
IF的解决方案S=:
更安全。
IFS=":" read -ra paths <<< "$PATH"
find "${paths[@]}" -type f -executable -name '*SRA*'
find -perm -o=x,-g=x,-u=x
#!/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