假设我想输入这样的内容:
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/*
或者,在我的版本中bash
,tabtab在通配符后立即点击会给出匹配文件的列表。
要“小心删除文件”,我建议使用交互标志 to rm
,或者再次添加前缀echo
echo rm -i f*o
rm -i f*o
诚然,两者都不会根据您的喜好预先提供列表。
答案2
这取决于您的 shell 的编辑模式。例如,我使用 vi 模式并输入Esc
and *
,通配符将得到扩展。
答案3
实际上行为如下(来自 O'Reilly 的“学习 bash Shell”)。
- Esc\如果有多个匹配项,则将完成最长的公共前缀;如果只有一个匹配项,则将完成文件/目录/...名称(
/
如果是目录,则添加 a)。 - Esc*行为类似,只是如果有多个完成,它会列出所有完成。
- Esc=回显您将获得的内容 Esc*并返回您键入的内容,而不进行任何更改。
作为一个例子(我自己尝试过),给定一个包含文件的目录
aaabbb aaaccc aaaddd
...$ vi a
Esc\会产生...$ vi aaa•
并让您处于插入模式•
。...$ vi a
Esc*会生成...$ vi aaabbb aaaccc aaaddd •
并让您处于插入模式•
(据我尝试,/
如果它是目录,它会添加 no )。...$ vi a
Esc=会回显aaabbb aaaccc aaaddd
并给你返回...$ vi a
,让你处于命令模式。
很明显,*
您使用的正则表达式中的尾随是默示;你可以写
rm build/ tmp/
然后按下Esc* 双方(是的,据我所知并尝试,Esc*扩展所有通配符仅出现在光标所在的以空格分隔的单词中)。
但是,如果您输入一个通配符,则不再隐含最后一个通配符,您必须明确提供它。事实上,如果有一个名为 的文件aaazzzwww
,则写入a*w
, aaazzzw
, a*z*
, 或a*w*
并按Esc\将完成到aaazzzwww
,但a*z
不会!