2010-10-05 79 views
2

我正在使用shell腳本讀取一個包含某些文件路徑的屬性文件。現在取決於這個文件路徑,我想創建zip文件的名稱。事情是這樣的......我的屬性文件內容::如何使用shell腳本在unix中創建所需的文件名

path=tmp/inputs/logs/abc 
path=tmp/backup/inte/xyz 
destpath=abc/xyz 

現在我能夠創建文件名爲abc.zip和xyz.zip爲:

paths=`grep path myfile.property |cut -d= -f2` 
d_path=`grep destpath myfile.property |cut -d= -f2`  
filename=$d_path/$(basename $paths).zip 

其中創建abc.zip和xyz.zip。但是我想通過獲取路徑的最後三個參數來創建名稱。事情是這樣的......

  • abc.zip應該inputs_logs_abc.zip
  • xyz.zip應該backup_inte_xyz.zip

編輯

Paths=`grep path myfile.txt |cut -d= -f2` 

d_Path=`grep destpath myfile.txt |cut -d= -f2` 

for s_Path in $Paths 

    do 

     prefix=${Paths%%/*/*/*}  
     without_prefix=${Paths##${prefix}/} 
     slashes_to_underscores=${without_prefix//\//_} 
     zipFile=$d_Path/${slashes_to_underscores}.zip 
     find $s_Path -type f -name "*.log" | xargs zip -mT $zipFile [email protected] 

    done 

以上就是我code.By使用這個我不能達到我的目標。 有人可以幫助我嗎?

+0

你正在編寫哪個shell?這些片段中的'destpath'和'd_path'的相關性是什麼? – Johnsyweb 2010-10-05 17:13:52

+0

我正在使用bash.destpath是屬性文件中存在的關鍵字,據此我讀取此文件並將此路徑存儲在d_path變量中。 – MAS1 2010-10-05 17:52:46

+0

然後我的答案應該可以解決你的問題。你可以在提示符下試一試,並在你去看它是如何工作的時候回顯變量。 – Johnsyweb 2010-10-05 18:36:11

回答

3

由於您使用bash(這也適用於zsh或類似的),您可以使用其內置的參數替換。

% path=tmp/inputs/logs/abc 
% prefix=${path%%/*/*/*} 
% without_prefix=${path##${prefix}/} 
% slashes_to_underscores=${without_prefix//\//_} 
% filename=${slashes_to_underscores}.zip   
% echo $filename   
inputs_logs_abc.zip 

根據需要,可以在${filename}之前加上${d_path}。在我的示例中,$path是硬編碼的,您將根據fahd's answeryour previous question,在${paths}的循環中分配此值。

  • ${var//exp/sub}替換$varexp所有實例sub
  • ${var%%exp}var
  • ${var##exp}正確修剪的exp任何實例從var

左修剪的exp任何實例編輯(在一些睡眠和澄清之後):

prefix=${path%%/*/*/*}做一個貪婪匹配從右到左。如果你在tmp之前有'/',這將會中斷(這不是你在評論中所說的,而是會給出結果)。將此行更改爲prefix=${path%/*/*/*}(單個百分比符號:非貪婪),並且應該修復更長和更短的路徑。

編輯2(以下更新質問):

我可以看到三個問題:

  1. 「路徑= grep path myfile.txt |cut -d= -f2」 #這 「destpath = ABC/XYZ」 匹配,你應該grep'^path='以獲得以「path =」開頭的行。
  2. 您在循環內使用${Paths}兩次,您應該使用(好奇命名)${s_Path}
  3. 您仍在使用prefix=行中的貪婪匹配。看我以前的編輯。
+0

@ Johnsyweb,thanx回覆。但是,上面的代碼文件夾全路徑文件名,意味着如果路徑是路徑= tmp/xyz /輸入/日誌/ abc然後它創建文件名爲tmp_xyz_inputs_logs_abc.zip。但是我只想把最後三個目錄命名爲inputs_logs_abc.zip。 – MAS1 2010-10-06 06:02:20

+0

我在循環中使用你的代碼(fahd的答案),它出現在我以前的問題中。 – MAS1 2010-10-06 06:03:34

+0

我的示例中的代碼是直接從命令行復制的。 'path = tmp/inputs/logs/abc'是輸入,'inputs_logs_abc.zip'是輸出結果。請附上您現在具有的完整代碼作爲您的問題的編輯,以便我可以查看錯誤的位置。 – Johnsyweb 2010-10-06 06:34:09

0

這是否適合您?

paths=$(grep path myfile.property |cut -d= -f2) 
d_path=$(grep destpath myfile.property |cut -d= -f2) 
extname=$(echo $paths | sed 's%^.*/\([^/]*/[^/]*/[^/]*\)$%\1%;s%/%_%g') 
filename=$d_path/$extname.zip 

sed腳本的第一個替代現在的路徑的最後三個組件之前刪除一切 - 不刪除任何東西,如果只有兩個 - 和第二剩餘斜線映射到下劃線。請注意,如果路徑具有尾部斜槓(儘管您可以添加替代項以刪除它們),您將遇到問題。如果名稱中包含/tmp/pattern,則還會在名稱中使用前導下劃線。您可能需要擔心使用'[^/][^/]*'來代替'[^/]*',以確保沒有空的組件名稱(然後您也可能擔心加倍的斜槓)。 GNU Sed爲您提供了額外的正則表達式功能,因此您可以使用'[^/]+'代替。

+0

Thanx for reply ..但是我在這裏給出的路徑都只是例子..所以我們無法預測路徑中的任何關鍵字。但是屬性文件中的路徑和d_path關鍵字是最終的。 – MAS1 2010-10-05 16:40:31