shell 会扩展**
——也就是说,如果您首先设置shopt -s globstar
并使用 Bash 4.0 或更高版本。在这种情况下,您可以查看 shell 与您的globstar
. 试试这些:
$ ls -d ~/projects/**/trunk/
或者:
$ echo ~/projects/**/trunk/
然后,去喝杯咖啡,因为globstar
可能需要很长时间才能执行。您可能会发现您甚至没有点击grep
或ack
返回匹配的文件。那是你生命中的几分钟,你已经浪费了,你将永远不会回来。还不如看过星球大战假期特辑。至少,你可以制作某种饮酒游戏。
问题globstar
在于 shell 被迫沿着你的整个目录树尝试匹配**
。然后,shell 在找到每个文件之前不会报告其结果。它很慢,而且效率很低。
这是我的系统上发生的事情:
$ time ls -d ~/projects/**/trunk
/Users/david/projects/foo/trunk /Users/david/projects/barfoo/trunk
/Users/david/projects/bar/trunk /Users/david/projects/foofoo/trunk
/Users/david/projects/foobar/trunk /Users/david/projects/trunk
real 0m18.19s
user 0m0.52s
sys 0m15.83s
在这六个结果弹出之前,我盯着终端站了将近 20 秒。如果我这样做了~/**/trunk
,它将花费 20 多分钟而没有返回一个结果(我在 20 分钟后将其杀死)。
这是等效的find
:
$ time find ~/projects -name trunk
/Users/david/projects/foo/trunk
/Users/david/projects/bar/trunk
/Users/david/projects/foobar/trunk
/Users/david/projects/barfoo/trunk
/Users/david/projects/foofoo/trunk
/Users/david/projects/trunk
real 0m4.09s
user 0m0.20s
sys 0m0.91s
比使用find
快四倍globstar
。另外,一旦找到结果就会返回。你最好使用find
:
$ find ~/projects -name trunk -type d -exec ack PATTERN {}\;