2014-11-05 61 views
2
存檔文件

我目前正在編寫一個腳本,它裝載一個samba共享,rsyncs數據到本地機器並歸檔到一個目錄結構(比如/ home/archive /)中。目前,在加入新的PDF文件,歸檔手工做這似乎是低效利用的時間Bash腳本根據

具有以下結構

ABC140003.pdf 
ABC140124.pdf 
. 
. 
ABC144201.pdf 
. 
ABC146012.pdf 

/home/archive/有幾個目錄2010/2011/2012,2013等

的文件

基本上,我需要分解數字以找到複製文件的正確子目錄。首先,我提取數

study_number=`echo $file | sed 's/[^0-9]//g'` 

那麼一年

year=20`echo $study_number | cut -c 1-2` 

上述所有PDF文件都屬於2014年的子目錄中地2014年OR任何一年目錄有以下子目錄2014/Blue/,/ 2014/Red/and/2014/Green /`。這對應於數字Blue(0),Red(4)和Green(6)中的第三個整數。

我在這裏使用的情況下找到我所說的學習型

type_int=`echo $study_number | cut -c 3` 
     case "$type_int" in 
     0) 
      type_string="Blue" 
      ;; 
     4) type_string="Red" 
      ;; 
     6) type_string="Green" 
      ;; 
     *) echo "$date: $file has unknown study type. Do not know where to place it" >> $logfile 
      continue 
      ;; 
     esac 

我現在知道了以下文件走在下列目錄

ABC140003.pdf -> /home/archive/2014/Blue/ 
ABC140124.pdf -> /home/archive/2014/Blue/ 
. 
. 
ABC144201.pdf -> /home/archive/2014/Red/ 
. 
ABC146012.pdf -> /home/archive/2014/Green/ 

我會很高興,如果這是目錄結構的結尾。但是,還有一層子目錄已經引入,因此沒有超過100個pdf文件的目錄(不是我的電話)。

例如/家庭/存檔/ 2014 /藍/有以下目錄: 140001-0100/ 140101-0200/ 140201-0300/ 140301-0400/ 140401-0500/ 140501-0600/

我現在需要想出一些邏輯使得下列文件到以下目錄

ABC140003.pdf -> /home/archive/2014/Blue/140001-0100 
ABC140124.pdf -> /home/archive/2014/Blue/140100-0124 
. 
. 
ABC144201.pdf -> /home/archive/2014/Red/144200-4300 
. 
ABC146012.pdf -> /home/archive/2014/Green/146000-6100 

我難倒就如何在邏輯上確定研究ABC146012應該在146000-6100在一個優雅的方式,而不訴諸多個if語句每個紅/藍/綠色的/

回答

3

這裏是一個簡化版本,需要一些工作,但你的想法(一個不錯的最終解決方案,請參閱@glenn傑克曼的解決方案):

關聯數組聲明的顏色

$ declare -A colors 
$ colors[0]=Blue 
$ colors[4]=Red 
$ colors[6]=Green 

然後將解壓所需的信息

$ study_number=$(sed 's/[^0-9]//g' <<< ABC140124.pdf); 
$ year=${study_number:0:2}; 
$ type=${study_number:2:1}; 
$ color=${colors[$type]}; 
$ from="${study_number:0:$((${#study_number}-2))}01" 
$ to="$((${study_number:0:$((${#study_number}-2))}+1))00" 

,並給出:

$ echo /home/archive/$year/$color/$from-$to 
/home/archive/14/Blue/140101-140200 

(我以爲你想你的時間間隔被一致編號「x01-(X + 11)00」)

您可以創建一個函數來簡化流程

build_dir() { 
    study_number=$(sed 's/[^0-9]//g' <<< $1); 
    year=${study_number:0:2}; 
    type=${study_number:2:1}; 
    color=${colors[$type]}; 
    from="${study_number:0:$((${#study_number}-2))}01" 
    to="$((${study_number:0:$((${#study_number}-2))}+1))00" 

    echo "/home/archive/$year/$color/$from-$to" 
} 

它需要多一點的防守編程相關的代碼行,但它可以像這樣使用:

$ build_dir ABC146012.pdf 
/home/archive/14/Green/146001-146100 
+0

夢幻般的,非常感謝。我對bash相當陌生,並從這個答案中學到了很多東西。我們在我們的部門中使用csh(不再) – moadeep 2014-11-05 14:36:25

2
colors=([0]=Blue [4]=Red [6]=Green) 

get_destination() { 
    if [[ $1 =~ ([0-9][0-9])([0-9])([0-9]) ]]; then 
     printf "/home/archive/20%s/%s/%s%s%d01-%s%d00" \ 
      ${BASH_REMATCH[1]} \ 
      ${colors[${BASH_REMATCH[2]}]} \ 
      ${BASH_REMATCH[1]} \ 
      ${BASH_REMATCH[2]} \ 
      ${BASH_REMATCH[3]} \ 
      ${BASH_REMATCH[2]} \ 
      $((1 + ${BASH_REMATCH[3]})) 
    fi 
} 

for file in ABC140003.pdf ABC140124.pdf ABC144201.pdf ABC146012.pdf; do 
    echo "$file -> $(get_destination $file)" 
done 
ABC140003.pdf -> /home/archive/2014/Blue/140001-0100 
ABC140124.pdf -> /home/archive/2014/Blue/140101-0200 
ABC144201.pdf -> /home/archive/2014/Red/144201-4300 
ABC146012.pdf -> /home/archive/2014/Green/146001-6100