经过几年的“BASHing”,我编写了几个自定义脚本。其中大多数我不会每天使用,因此很容易忘记我如何命名它们,尽管我尽可能保持一致。
所以我知道,如果我打算运行我的FLAC2MP3.bat
,我只需写FLA
+ TABTAB,然后我就有了 Bash 可以在我的 $PATH 中找到的内容的列表:
FLAC2MP3.bat FLAC2MP3.bat~ FlashPlayerApp.exe FlashPlayerCPLApp.cpl
是否可以进行相同类型的搜索,但编写*MP3*
(或类似的内容)来搜索与我的 PATH 上的模式匹配的任何文件?当我写下这个并按下TAB(一次或两次)时,基本上什么也没有发生。
我已经尝试过的:
- 虽然它与我的问题不同,但我已经尝试过“如何让 bash 自动完成通配符?“。它们似乎只与当前目录内容的完成有关,这根本不是我的情况。
- 这个答案对于一个几乎类似的问题(但不涉及通配符)似乎是一个好主意:使用
find
on$PATH
。虽然它不像 press 那样实用TAB,但它可能是一个解决方案。然而,我几乎发疯了,变量扩展没有成功,因为我的 PATH(与大多数 Cygwin PATH 一样)在某些目录中包含空格,并且扩展在找到它们时会插入单引号 (find \'${PATH/:/\' \'}\' -maxdepth 1 -iname mp3 -print -quit
)。事实上,我为了完成这项工作花费了太多时间,以至于它几乎可以成为一个单独的问题。
答案1
答案2
会
ls `echo $PATH | sed s@ @\\ @g | sed s@:@ @g` | grep [string]
在这两方面都完成您所需要的?sed s@ @\\ @g
应该$PATH
用可读的转义空格替换其中包含空格的条目,并且应该用普通空格sed s@:@ @g
替换分隔条目的冒号,这样可以单独列出每个目录的内容,可以将其传递到其中,以识别正则表达式搜索,例如您想要的通配符使用。据我所知,这在本机 Bash 中有效,但我不确定它是否在 Cygwin 的 Bash 中有效。$PATH
ls
grep
如果它确实有效,您可以随时为其添加别名,这样使用起来就不那么麻烦了。
答案3
我没有回答你的主要问题,但我对你的第二个“我已经尝试过的”项目感到好奇,到目前为止,我能做的最好的事情是使用单个命令(没有子shell)来实现它:
IFS=: find_path=(${PATH}) && find "${find_path[@]}" <your_find_params>
这很丑陋,并证明单命令/无子 shell 可能不值得付出努力。根据下面斯蒂芬的评论,你可以做类似的事情
(IFS=:; set -f; find $PATH <your_find_params>)
编辑:当然,这不能处理路径组件中嵌入换行符的情况,但谁在乎呢……我们生活在现实世界中。 :)