列出当前路径中的所有文件/二进制文件

列出当前路径中的所有文件/二进制文件

是否有一种“简单”的方法来运行“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/fooprints /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不会打印错误

相关内容