2013-07-22 16 views
0

我想獲取一個目錄名的一部分保存到一個變量,以便我可以將其添加到文件名的開頭。grep/awk部分目錄名到變量迭代

這是我到目前爲止有:

var=1 
CH=`ls | awk '/[0-9]{2}(?=_.*)/ {if (NR=$var) print $0}'` 
echo $CH 

的文件夾名字看起來像01_Startup。但回聲是空白的。我無法弄清楚這一點。有誰知道這是否可以用shell腳本?我不太確定|的順序以及如何組合命令。謝謝。

樹:

Benu-master 
| 
|--Chapter_02_Startup 
|--|--01_Source_tree 
|--|--02_Console 
|--|--03_DEBUG 

等。

+0

問題說'文件夾名看起來像01_Startup'但你的圖片顯示的文件夾名稱爲'Chapter_02_Startup'。哪一個是正確的? – anubhava

+0

另外你想把prefx'02_'放在chapter子文件夾中的所有文件中,或者只放在'* _DEBUG'文件中? – anubhava

+0

@anubhava我在下面解釋說我犯了一個錯誤,並且打算說我想要文件夾'Chapter_02_Startup'。我想在每個子文件夾的iso文件前綴。 .iso的名稱如「01_Source_tree.iso」和「02_Console」等。 –

回答

1

這樣的事情?

for c in Chapter_*; do 
    v=${c#Chapter_} 
    v=${v%%_*} 
    echo chapter $c has number $v # more chapter-processing code here 
done 

另外,avoid parsing ls output

+0

用包含章節名稱的變量替換'(pwd)',它可以工作!出於某種原因,它可以在除文件夾2之外的每個文件夾上都有效所有其他的文件夾是'Chapter _ ## _ xxx',而第二章就像'Chapter _ ## _ xxx_xxx'。當另一個下劃線出現時,這似乎不起作用。任何想法爲什麼?我可以重命名該文件夾,但我很好奇它爲什麼會失敗。 –

+0

'$ {var%pattern}'替換替代最短可能的模式,而'$ {var %%模式}替代最長匹配。更新答案以允許多個下劃線。 – tripleee

+0

完美!非常感謝! –

1

awk不支持PCRE所以積極的前瞻不起作用。另外,bash變量不能像這樣調用到awk

我看到您的需求可以通過bash建立在字符串替換中。

$ var=01_Startup 
$ echo "${var%_*}" 
01 

您可以使用find來收集目錄列表並使用字符串替換。

find . -type d | while read -r dir; do echo "$dir ---> ${dir%_*}"; done 
+0

嗯,我需要能夠迭代運行該命令。我遞歸地編譯程序,所以我需要一個計數器,所以我可以進入下一個子目錄。我設置的方式是:'buildall.sh'在主目錄中,以及其他8個文件夾。這8個文件夾中的每一個都有1-6個包含要編譯程序的子文件夾。我想從這些子文件夾中獲取起始號碼並將其添加到其程序中。 –

+0

所以,子文件夾有數字,文件夾也有數字嗎?你可以做'樹主文件夾'並把你的問題的輸出? –

+0

有超過6000個文件,所以輸出太大了。甚至連終端都太大了!我在第一篇文章中提到了它的骨架。我只是試圖從頂級目錄中獲取數字(如Chapter_02_Startup)。我意識到之前我說過我試圖從最低的目錄中獲取數字,這是一個錯誤... –

1

試試這個find命令使用awk:

find Chapter* -name "*.iso" -type f | awk -F'/' '{ 
    split($1, a, "_"); 
    system("mv " $0 " " $1 "/" a[2] "_" $2) 
}' 
+0

謝謝你,但是tripleee擊敗你。 :) –

+0

無論什麼對你最終重要的是你的問題得到解決:) – anubhava