2013-11-21 28 views
1

我拼命地試圖編寫一個模式尋找命令,但它永遠不會工作。我想搜索所有*.txt*.h文件:BASH:如何正確使用模式與查找

find . -name "*(*.h|*.txt)" 

find . -name "(*.h|*.txt)" 

find . -name *(*.h|*.txt) 

find . -name "*\(*.h|*.txt\)" 

find . -name '*("*.h"|"*.txt")' 

回答

3

在這裏你去:

find . -name '*.h' -o -name '*.txt' 

如果你有不只是名字多種條件,例如修改時間不到5天,那麼你最想組的多個名稱的條件下,這樣的:

find . -mtime -5 \(-name '*.h' -o -name '*.txt' \) 

這樣,你的條件爲「TIME AND(NAME1 OR NAME2)」,沒有分組將是「時間和名稱1或NAME2」,這是不一樣的,因爲後者將是非常的評估「(時間和名稱1)或名稱2" 。

嗯,這取決於你想要做什麼,只記得,當你使用OR條件這樣,你可能需要使用\(... \)分組在上面的例子。

UPDATE

如果你的的find版本支持-regex標誌,那麼另一種解決方案:

find . -regex '.*\.\(txt\|h\)' 

我覺得這更像是你要找的人;-)

儘管-name pattern中的圖案可以匹配像*,?和這樣的常規殼模式,看起來它們不能匹配extended patterns,即使extglob已啓用。

+0

是的,我正在等待這個。我仍然不知道爲什麼我不能使用[模式匹配](http://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html),但這至少給我一個很好的關於這種新的邏輯表達式的想法。 – Mazyod

+1

@Mazyod好點。看到我更新的答案。 – janos

3

使用該表達式:

find . -type f \(-name "*.h" -or -name "*.txt" \) 
  • -type f剛剛找到的文件。
  • -name \(logical condition \)只是與您指定的文件擴展名匹配。