[英]linux find files with optional character in their name
假設我有兩個文件: ac
和abc
。 我想找到一個正則表達式來匹配這兩個文件。 通常我希望以下正則表達式可以工作,但它永遠不會:
find ./ -name ab?c
我試過逃避或不逃避問號,這似乎從來沒有奏效。 通常在我發現的正則表達式文檔中; ?
意思是:前一個字符重復了 0 或 1 次,但find
似乎不明白這一點。
我在兩個不同的 find 版本上嘗試過這個:GNU find version 4.2.31 和 find (GNU findutils) 4.6.0
PS:這適用於*
,但我特別想只匹配一個可選字符。
find ./ -name a*c
給
./ac
./abc
傳遞給-name
的表達式不是正則表達式,而是全局表達式。 (單個)glob 表達式不能用於您的用例,但您可以使用正則表達式-regex
:
find -regex '.*/ab?c'
順便說一句,默認的正則表達式語言是 Emacs 樣式,如下所述: https : //www.emacswiki.org/emacs/RegularExpression 。 您可以使用-regextype
更改正則表達式語言。
要僅使用一個可選字符匹配表達式,請嘗試使用or
選項:
touch abc ac abbc
find . -name "a?c" -or -name "ac"
只給你: abc
和ac
名稱。
通常,您可以使用or
and
選項構建非常復雜的查找查詢 =)
find -name
選項使用 glob 模式,這與正則表達式不同。 對於球體, ?
表示任何單個字符。 如果你想要一個字符是可選的,你需要使用兩種模式:
find ./ -name abc -o -name ac
其他答案足以提供解決方案,但了解find
的-regex
選項在整個條目上匹配是必不可少的。 所以你不能只做部分匹配:
-regex 'ab?c'
您必須使用一兩個點星:
-regex '.*ab?c.*'
同樣沒有通配符,這可以使用grep
:
ls . | grep 'ab\?c'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.