如何在bash中使用`find`将文件与子目录进行匹配?
问题描述:
在linux下的bash,我的目录是这样的:如何在bash中使用`find`将文件与子目录进行匹配?
.
├── index.md
├── rss.conf
└── tech
└── comp.md
在那里我想有相对文件名的所有*.md
文件的列表。这里寻找一些答案,我已经收集了:find -name *.md
其中仅输出./index.md
(古怪,如果我一个cd ../
后运行命令它找到所有*.md
)
我怎么可能会解决这个?
答
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
答
行情!
find . -name '*.md'
否则,如果在.md
结尾的名称的任何文件在当前目录中存在,水珠是由你的shell扩展(替换在当前目录中匹配的文件名列表)开始find
之前。
请注意,参数.
只能在GNU find
中省略;包括它明确是更便携的做法。
在这种情况下单引号和双引号的区别? –
不是在这种情况下。我倾向于建议单引号,除非有明确的理由使用双引号,因为单引号是更明确的形式(对于读者来说,即使没有看内容,也不会发生扩展)。 –