2017-02-27 60 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

不是在這種情況下。我傾向於建議單引號,除非有明確的理由使用雙引號,因爲單引號是更明確的形式(對於讀者來說,即使沒有看內容,也不會發生擴展)。 –

相關問題