2014-01-06 48 views
1

的文件名顯示部我有作爲在其內部具有許多目錄及其名稱的圖案的目錄: YYYYDDMM_HHMISS 實施例:20140102_120202 欲僅提取YYYYDDMM一部分。 我試過ls -l|awk '{print $9}'|grep -o ^[0-9]*並得到了答案。 但是我有以下問題:的grep -o和使用LS

  1. 爲什麼犯規此返回任何結果:ls -l|awk '{print $9}'|grep -o [0-9]*。事實上,它應該已經返回了所有的目錄。 奇怪的只是,包括 '^' 之前[0-9]工作正常: ls -l|awk '{print $9}'|grep -o ^[0-9]*

  2. 任何其他(簡單)的方式實現的結果呢?

+1

原因'[0-9] *'什麼也沒有匹配是什麼都沒有足夠的匹配,所以'grep'停在那裏。嘗試'[0-9] [0-9] *'或'grep -E'[0-9] +'',儘管沒有錨也會匹配時間戳。 – tripleee

+0

務必引用正則表達式來防止shell試圖將其視爲模式。如果shell成功,則正則表達式將被替換爲匹配它的文件名列表。 – chepner

回答

2

您必須避免解析ls輸出。

簡單的就是用這個的printf:

printf "%s\n" [0-9]*_[0-9]*|egrep -o '^[0-9]+' 
4

爲什麼犯規此返回任何結果:ls -l|awk '{print $9}'|grep -o [0-9]*

如果在當前目錄中的文件與[0-9]開始,然後殼將在致電grep之前展開它們。舉例來說,如果我有兩個文件a1a2a3並運行此:

ls | grep a* 

的文件名擴展後,外殼就會運行此:

ls | grep a1 a2 a3 

其結果是,它將打印在a2a3線匹配文本「A1」這一點。它還將忽略無論是從標準輸入設備來了,因爲當你指定的文件名grep(第二個參數及以後),它會忽略標準輸入。

其次,考慮一下:

ls | grep ^a* 

這裏,^沒有特殊意義的外殼,所以使用它一字不差。由於我沒有以^a開頭的文件名,它將使用^a*作爲模式。如果我也有像^asomething^another,然後再次文件名,^a*將擴大到這些文件名和grep會做一些我並沒有真正打算。

這就是爲什麼你要引用的搜索模式,以防止shell擴展它們。這同樣適用於find /path -name 'pattern'中的模式。

至於你想要的東西更簡單的方法,我想這應該這樣做:

ls | sed -ne 's/_.*//p' 
3

,只顯示目錄名的YYDDMM部分:

for i in ./*; do echo $(basename "${i%%_*}"); done 

不知道你想要用它做一次,但你得到它雖然...

+0

或'因爲我在*;做回聲「$ {i %% _ *}」;或許。 –

+0

是的,確實更清潔。 – Platoxia