2012-09-24 94 views
5

我有一個Apache服務器上的目錄(的Linux/Unix)與大量含有大量的文件這樣的子目錄:如何用grep和regex查找目錄中的所有文件?

 
- Dir 
    - 2010_01/ 
    - 142_78596_101_322.pdf 
    - 12_10.pdf 
    - ... 
    - 2010_02/ 
    - ... 

我怎樣才能找到filesnames所有文件看起來像:*_*_*_*.pdf?哪裏*總是一個數字!

我試圖解決這個問題是這樣的:

ls -1Rl 2010-01 | grep -i '\(\d)+[_](\d)+[_](\d)+[_](\d)+[.](pdf)$' | wc -l 

但正則表達式\(\d)+[_](\d)+[_](\d)+[_](\d)+[.](pdf)$不使用grep工作。

編輯1:嘗試ls -l 2010-03 | grep -E '(\d+_){3}\d+\.pdf' | wc -l例如只返回null。所以它不是完美的工作

+1

\ d表示數字,所以你的正則表達式正在尋找:digits_digits_digits_digits.pdf。你不想匹配什麼類型的文件名? –

+0

哦對不起...我編輯我的帖子 – trouble

+0

您是否想在示例中匹配'12_10.pdf'或僅匹配'142_78596_101_322.pdf'? –

回答

0

感謝:

$ cat test2.txt | grep '((?:\d+_){3}(?:\d+)\.pdf$)' 
... no return 

但是如果你使用擴展模式開關(與調用egrep的)不工作到gbchaosmaster and 我找到一種方法,適合我:

到一個目錄

find . | grep -P "(\d+_){3}\d+\.pdf" | wc -l 

在根目錄

find 20*/ | grep -P "(\d+_){3}\d+\.pdf" | wc -l 
3

嘗試使用find

滿足您的規格__*_*.pdf where * is always a digit命令:

find 2010_10/ -regex '__\d+_\d+\.pdf' 

你似乎想用下劃線分隔的4個數字的序列,但是,根據您嘗試過的正則表達式。

(\d+_){3}\d+\.pdf 

或者你想匹配所有僅包含數字/下劃線的名字嗎?

[\d_]+\.pdf 
+0

格式化的stackoverflow刪除了一些字符!文件格式爲'* _ * _ * _ *。pdf'我會嘗試你發佈的正則表達式! – trouble

+0

我嘗試'(\ d + _){3} \ d + \。pdf' find和grep沒有成功! – trouble

+1

我不是處於可以測試這種情況的環境中,但您可能需要將'-regextype posix-extended'標誌添加到'find'命令。 – vinnydiehl

1

首先,您應該使用egrep vs grep或使用-E調用grep來擴展模式。

所以這對我的作品:

$ cat test2.txt 
- Dir 
    - 2010_01/ 
    - 142_78596_101_322.pdf 
    - 12_10.pdf 
    - ... 
    - 2010_02/ 
    - ... 

現在egrep命令該文件:

cat test2.txt | egrep '((?:\d+_){3}(?:\d+)\.pdf$)' 
- 142_78596_101_322.pdf 

既然有圍繞整個圖案括號,整個文件名會被捕獲。

注意,模式不以傳統方式grep的工作:

$ cat test2.txt | grep -E '((?:\d+_){3}(?:\d+)\.pdf$)' 
- 142_78596_101_322.pdf 
相關問題