在linux下的bash,我的目錄是這樣的:如何在bash中使用`find`將文件與子目錄進行匹配?
.
├── index.md
├── rss.conf
└── tech
└── comp.md
在那裏我想有相對文件名的所有*.md
文件的列表。這裏尋找一些答案,我已經收集了:find -name *.md
其中僅輸出./index.md
(古怪,如果我一個cd ../
後運行命令它找到所有*.md
)
我怎麼可能會解決這個?
在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
中省略;包括它明確是更便攜的做法。
在這種情況下單引號和雙引號的區別? –
不是在這種情況下。我傾向於建議單引號,除非有明確的理由使用雙引號,因爲單引號是更明確的形式(對於讀者來說,即使沒有看內容,也不會發生擴展)。 –