使用特定字符串在我的PATH中查找可执行文件

时间:2015-10-29 13:43:21

标签: bash shell

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

我问的原因是我有几个脚本中包含字符SRA。问题是我总是忘记文件的起始字符(如果我记得,我使用制表符完成找到它)。

4 个答案:

答案 0 :(得分:2)

例如:

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

如果你碰巧在$ PATH中有空格(或其他危险字符)(从@fedorqui的答案借来的<<<技巧):

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

它还正确处理空的$ PATH。

答案 1 :(得分: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查找可执行文件。
  • grep -l只显示符号匹配的文件名。

由于-executable选项在FreeBSD或OSX中不可用,ghoti nicely recommends使用-perm选项:

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

答案 2 :(得分:1)

有点笨拙:

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

答案 3 :(得分:0)

我为 OSX 编写了一个 bash 脚本,based off this great answer 在此页面上。

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

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