2017-02-27 32 views
1

在linux下的bash,我的目录是这样的:如何在bash中使用`find`将文件与子目录进行匹配?

. 
├── index.md 
├── rss.conf 
└── tech 
    └── comp.md 

在那里我想有相对文件名的所有*.md文件的列表。这里寻找一些答案,我已经收集了:find -name *.md

其中仅输出./index.md

(古怪,如果我一个cd ../后运行命令它找到所有*.md

我怎么可能会解决这个?

回答

4
find . -name *.md 

只能找到index.md因为命令实际上扩展到

find . -name index.md 

也就是说,find只看到了一个名字。 (这就是globs的工作方式 - 在执行命令之前它们会在shell中进行扩展)。

您需要做的仅仅是将命令放在引号中,以便glob不会展开。

find . -name '*.md' 

在一般情况下,如果你想知道为什么一个命令是不是做你期望的那样,在shell中运行set -x。这会导致它在调用之前输出真实命令。

$ set -x 
+ set -x 
$ find . -name *.md 
+ find . -name index.md 
./index.md 
$ find . -name '*.md' 
+ find . -name '*.md' 
./index.md 
./tech/comp.md 
4

行情!

find . -name '*.md' 

否则,如果在.md结尾的名称的任何文件在当前目录中存在,水珠是由你的shell扩展(替换在当前目录中匹配的文件名列表)开始find之前。

请注意,参数.只能在GNU find中省略;包括它明确是更便携的做法。

+0

在这种情况下单引号和双引号的区别? –

+3

不是在这种情况下。我倾向于建议单引号,除非有明确的理由使用双引号,因为单引号是更明确的形式(对于读者来说,即使没有看内容,也不会发生扩展)。 –

相关问题