是否有一种“简单”的方法来运行“ls -la”样式命令来列出当前路径中的所有文件/可执行二进制文件?
(我打算将输出通过管道传输到 grep 中,以查找带有未知前缀但基本上已知“名称”的命令,这种情况下 bash 中的自动完成/制表符基本上是无用的。所以某种“反向自动”完整的功能”...)
答案1
compgen -c # will list all the commands you could run.
compgen -a # will list all the aliases you could run.
compgen -b # will list all the built-ins you could run.
compgen -k # will list all the keywords you could run.
compgen -A function # will list all the functions you could run.
compgen -A function -abck # will list all the above in one go.
答案2
这是一个列出目录内容的函数$PATH
。如果传递参数,该函数仅列出名称包含参数之一的命令。参数被解释为全局模式。
shopt -s extglob
lspath () {
local IFS pattern
IFS='|'
pattern="*@($*)*"
IFS=':'
for d in $PATH; do
for x in "$d/"$pattern; do
[ "$x" = "$d/$pattern" ] || echo "${x##*/}"
done
done | sort -u
}
与许多事情一样,这在 zsh 中更容易。
lspath () {
(($#)) || set ''
print -lr -- $^path/*$^@*(N:t) | sort -u
}
^
中的人物参数扩展导致与数组连接的文本添加到每个数组元素,例如path=(/bin /usr/bin); echo $^path/foo
prints /bin/foo /usr/bin/foo
。
/*$^@*
看起来像漫画侮辱,但实际上是普通字符/
,通配符*
,带有修饰符的特殊参数$@
(位置参数数组)^
,等等*
。
(N:t)
是个全局限定符 N
如果没有匹配,则得到一个空扩展历史修改器 t
仅保留每场比赛的基本名称(“尾部”)。
更神秘的是,避免外部调用,但这只是表面上的兴趣:
lspath () {
(($#)) || set ''
local names; names=($^path/*$^@*(N:t))
print -lr -- ${(ou)names}
}
事实上,您可能正在寻找apropos
命令,它搜索简短描述包含关键字的命令的手册页。一个限制是这只能查找具有手册页的命令。
答案3
function findinpath () {
OLDIFS="$IFS" ;
IFS="$(printf ':\t\n')" ;
for regexp in "$@" ; do
for adir in $PATH ; do
find "$adir" -perm -111 -a ! -type d -ls 2>/dev/null | grep -i "/[^/]*$regexp"
done ;
done ;
IFS="$OLDIFS" ;
}
该查找仅匹配:至少设置了一个“x”(可执行)位,并且这不是一个目录。
并将其与要找到的正则表达式列表一起使用:
findinpath awk sed '\.sh$'
答案4
for i in $(echo $PATH | sed -e 's/\:/\ /g'); do find "$i" -perm +rwx -exec echo {} \; 2> /dev/null; done
首先我们回显$PATH
到 sed 并将“:”替换为“”。
然后我们对每一件事进行查找,以查找带有 rwx 的文件并回显它们。
2> /dev/null
这样就find
不会打印错误