2009-10-09 76 views
0

我正在寫shell腳本,並且卡住了。要求是:我將接收其上有序號的文件,如xyz0001abcd.DAT。我創建了該文件的一個副本,保留序列號爲abcd000001gfh.DAT。原始文件名使用四位數字(最大9999),複製的文件使用六位(最大999999)。用於更改文件名上的序列號的腳本

當9999在原始文件中出現時,我卡住了。原始文件序列號將環繞,但我希望複製的文件序號繼續。也就是說,映射9999-> 009999之後,我將獲得0001第二次,並將其映射到10000,這樣複製的文件可以使用它的編號一直持續到999999

xyz0001abcd.DAT -> abcd000001gfh.DAT 
xyz0002abcd.DAT -> abcd000002gfh.DAT 
. 
. 
. 
xyz9999abcd.DAT -> abcd009999gfh.DAT # First sequence wraps around. 
xyz0001abcd.DAT -> abcd010000gfh.DAT 
xyz0002abcd.DAT -> abcd010001gfh.DAT 

這怎麼可能在做shell腳本的形式?

+0

好!這是一個現存的腳本,作爲守護進程運行,持續監視文件並創建文件副本,但它直接放置序列號,因此我需要更改進程的行爲。 – Vijay 2009-10-09 14:34:59

+1

顯示您的代碼。 – ghostdog74 2009-10-09 15:03:04

+0

如果將0001映射到10001,在原始文件編號中跳過10000或包含0000,這將會更漂亮。 mouviciel的答案跳過10000,讓你使用字符串前綴而不是模塊化算術。 – Cascabel 2009-10-09 17:34:11

回答

0

你可以讓你的原始文件與序列號:

echo $myFileName | sed 's/^[^0-9]*\(....\).*$/\1/' 

你可以讓你的原始文件命名的所有現有的重複文件的列表,但以兩位數的前綴,你需要具有:

printf "%s\n" ` `echo $myFileName | sed "s/\([0-9]\)/??\1/" ` 

你可以得到重複的文件與兩位數的前綴:

echo $myDupFileName | sed 's/^[^0-9]*\(..\).*$/\1/' 

並結合前面兩個命令原始文件命名的所有重複文件的最大兩位數前綴:

printf "%s\n" ` `echo $myFileName | sed "s/\([0-9]\)/??\1/" ` \ 
| tail -1 \ 
| sed 's/^[^0-9]*\(..\).*$/\1/' 

我留下作爲一個練習:

  • 這個最大前綴的增量,
  • 測試還沒有重複時的情況,
  • 根據已收集的所有信息構建一個新名稱。
+0

以及這可以幫助我一點。但目的仍然沒有解決,因爲有99個週期來我必須循環99次。像0001-9999被認爲是一個週期,並且下一個重新開始0001被認爲是第二週期。 – Vijay 2009-10-10 07:50:10

+0

我的假設是,您可以通過觀察現有重複文件的文件名來識別週期,這些重複文件以該週期編號。 – mouviciel 2009-10-10 11:27:42

相關問題