2016-01-13 25 views
0

因此,我正在嘗試編寫一個shell腳本,用於查找當前目錄中與我的腳本中作爲參數給定的固定正則表達式模式(基本正則表達式)相匹配的所有文件。查找匹配正則表達式的文件

我想出是:

find ./ -maxdepth 1 -type f -regex "\.\/"$1"" 

我有那些./在開始的時候,因爲find命令找到我的文件和打印他們./files格式。

如果我給腳本參數a。*,但是如果我試圖給它類似[0-9] \ {2 \} [a-zA-Z] *來查找所有文件以2位數字開頭,後面跟着字母,沒有任何反應,我發現它與轉義特殊字符有關,但我似乎無法理解爲什麼以及如何正確地做到這一點...

+1

您認爲'$ 1'在這裏做什麼? – Sobrique

+0

大概這條線是在某個腳本或函數內。你通過它時引用了這個論點嗎? 'your_func'[0-9] \ {2 \} [a-zA-Z] *'' –

+0

我並沒有引用這個參數,但它似乎並不起作用,即使我像那樣和那樣傳遞它, $ 1被替換爲參數,但我沒有在腳本中引用它,我想 – Crouze

回答

1

應該報價你傳遞參數,否則它可能是水珠展開傳遞之前通過外殼。此外,您將失去\,因爲shell會將\{這樣的內容擴展爲{

你也應該引用你的論點$1這樣的:

find_regex() { 
    find ./ -maxdepth 1 -type f -regex "\./$1" 
} 

# usage: find_regex '[0-9]\{2\}[a-zA-Z]*' 

此相匹配的文字.,隨後/,然後傳遞給函數的參數。你在這個問題中的方式意味着$1不在雙引號之內,所以你會受到全局擴展和第二次丟失斜線的影響。

+0

是否在所有版本的find中都存在?{}?因爲我的測試案例似乎並不「喜歡」它。在任何逃脫模式。 – Sobrique

+0

只有某些版本支持'-regex'開關,並且根據[GNU查找文檔](https://www.gnu.org/software/findutils/manual/html_mono/find.html),POSIX基本正則表達式被支持。所以應該理解爲「N」發生。 –

1

我會猜測這是因爲你的文件名不是以數字開頭。

嘗試運行:

find ./ -depth 1 

而且看你的路徑。特別是在find手冊頁,注意:

這是整個路徑上的匹配,不是搜索

所以,你應該假設隱含^$錨。

你可能想是這樣的:

find ./ -depth 1 -regex "\./[0-9][0-9][A-Za-z]*" 

我沒有{}作爲量詞得到任何快樂,所以都選擇了該作品的簡單答案。這可能歸結於find的不同版本。

或者我可能會建議使用Perl是的,尤其是當你只穿過一層:

perl -e 'print join "\n", grep {m/^\d{2}/} glob ("*") ' 

它使用subtley不同的Perl的grep,其中它匹配明智的不僅是文件名(從*擴大)。

或者,您可以添加路徑:

perl -e 'print join "\n", grep {m,/\d{2},} glob ("./*")'