2015-11-10 32 views
0

分別命名爲文件名在我的目錄中我有很多的*.yml文件命名,如:插入dirnames中成在bash

work-arran.yml 
work-cap.yml 
work-exposed.yml 
work-humax.yml 
work-instruc.yml 
work-kiln.yml 
work-lex.yml 
work-merc.yml 

,也有相同的名字目錄,但用下劃線代替破折號:

work_cap 
work_exposed 
work_humax 
work_instruc 
work_kiln 
work_lex 
work_merc 

我想將yaml記錄grid_pool: dir_name_here自動分配到每個 *.yml文件中,其中dir_name_here將是每個 文件各自目錄的名稱。

試過這個,雖然它可以工作,但它會在 * .yml文件的下劃線版本中添加所需的行,而不是虛線。

如何更改最後的fn.yml因此它將_替換爲-

ls *.yml | sed 's/-/_/g' | sed 's/.yml//g' | xargs -n1 -I fn bash -c "echo ' grid_pool: fn' >> fn.yml" 
+2

[你不應該在腳本中使用'ls'。](http://mywiki.wooledge.org/ParsingLs) – tripleee

+0

這只是一次oneliner – branquito

+4

不過,'ls * .yml'中的'ls'是毫無意義的; shell會擴展通配符,'ls'在shell已經生成匹配列表之後不會添加任何值(並且可能會添加負值的東西)。鏈接解釋了所有可能出錯的事情。 – tripleee

回答

3

使用參數擴展與替代:

for file in *.yml ; do 
    dirname=${file/-/_} 
    echo " grid_pool: ${dirname%.yml}" >> "$file" 
done 

您可以使用xargs相同的方法,但我擔心它會慢一些,因爲它開始爲每個文件一個新的外殼:

... | xargs -I fn bash -c 's=fn; echo " grid_pool: fn" >> ${s/_/-}.yml' 
+0

是否可以一次去掉'.yml',同時用'_'替換'-'? – branquito

+1

您需要兩個步驟在變量值的不同部分執行替換。 – tripleee

+0

只是爲了好奇,是否有可能在我一直在試圖解決的第二個'FN'? – branquito