在执行命令之前展开命令中的通配符

在执行命令之前展开命令中的通配符

假设我想输入这样的内容:

rm build/* tmp/*

我即将运行它,但我想在执行之前扩展通配符,以便我可以验证即将发生的情况。我怎样才能做到这一点?

这是我正在寻找的工作流程:

$ rm build/* tmp/* <press some magic key>
$ rm build/foo build/bar tmp/wiz tmp/buzz

(编辑)另一个示例工作流程:

$ # Check what is in directory: 
$ ls -0
foo1
foo2
bar
$ # I want to delete foo1 and foo2, but want to do so carefully: 
$ rm f*o <press some magic key>
$ rm foo1 foo2

我可以像这样扩展其他内容:

cd `hg root` <Ctrl-x>
cd /users/bob/myMercurialRepository

(因为我的Control-x shell-expand-line~/.inputrc

我虽然man bash查看了 globbing 的描述,但找不到任何有趣的东西。

答案1

怎么样

echo rm build/* tmp/*

或者,在我的版本中bashtabtab在通配符后立即点击会给出匹配文件的列表。

要“小心删除文件”,我建议使用交互标志 to rm,或者再次添加前缀echo

echo rm -i f*o
rm -i f*o

诚然,两者都不会根据您的喜好预先提供列表。

答案2

这取决于您的 shell 的编辑模式。例如,我使用 vi 模式并输入Escand *,通配符将得到扩展。

答案3

实际上行为如下(来自 O'Reilly 的“学习 bash Shell”)。

  1. Esc\如果有多个匹配项,则将完成最长的公共前缀;如果只有一个匹配项,则将完成文件/目录/...名称(/如果是目录,则添加 a)。
  2. Esc*行为类似,只是如果有多个完成,它会列出所有完成。
  3. Esc=回显您将获得的内容 Esc*并返回您键入的内容,而不进行任何更改。

作为一个例子(我自己尝试过),给定一个包含文件的目录

aaabbb  aaaccc  aaaddd
  1. ...$ vi aEsc\会产生...$ vi aaa•并让您处于插入模式
  2. ...$ vi aEsc*会生成...$ vi aaabbb aaaccc aaaddd •并让您处于插入模式(据我尝试,/如果它是目录,它会添加 no )。
  3. ...$ vi aEsc=会回显aaabbb aaaccc aaaddd并给你返回...$ vi a,让你处于命令模式。

很明显,*您使用的正则表达式中的尾随是默示;你可以写

rm build/ tmp/

然后按下Esc* 双方(是的,据我所知并尝试,Esc*扩展所有通配符仅出现在光标所在的以空格分隔的单词中)。

但是,如果您输入一个通配符,则不再隐含最后一个通配符,您必须明确提供它。事实上,如果有一个名为 的文件aaazzzwww,则写入a*w, aaazzzw, a*z*, 或a*w*并按Esc\将完成到aaazzzwww,但a*z不会!

相关内容