有没有办法快速了解我的$PATH
中的可执行文件是否包含特定字符串?例如,我想快速列出包含SRA
的可执行文件。
我问的原因是我有几个脚本中包含字符SRA
。问题是我总是忘记文件的起始字符(如果我记得,我使用制表符完成找到它)。
答案 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 在此页面上。
我认为也适用于其他操作系统。请注意,它还会忽略错误,对结果进行排序,并且也只显示唯一值!
#!/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