2012-07-28 190 views
0

我想寫一個bash shell腳本來同步兩個不同路徑上的內容。Bash腳本遞歸遍歷目錄,比較和同步文件

我追求的算法包括以下步驟

  1. 給出兩個完整的(而不是相對)路徑
  2. 遞歸的比較文件(即文件名可任選有 基本名和後綴)兩個路徑的相應目錄
  3. 如果對應的目錄或文件不存在,則 將每個文件(從文件夾路徑)複製到其他 對應的文件夾。

我已經想通了步驟1和2分別

OLD_IFS=$IFS 
# The extra space after is crucial 
IFS=\ 

for old_file in `diff -rq old/ new/ | grep "^Files.*differ$" | sed 's/^Files \(.*\) and .* differ$/\1/'` 
do 
    mv $old_file $old_file.old 
done 
IFS=$OLD_IFS 

感謝。

+3

爲什麼不使用像'rsync',而不是寫能力較差你自己的東西嗎? – thkala 2012-07-28 19:20:51

+1

自學。試圖學習如何編寫bash腳本。但這不是一項家庭作業。 – 2012-07-28 19:24:18

+0

這很好 - 步驟3中的確切問題是什麼? – thkala 2012-07-28 19:29:21

回答

1

我已經實現在Java中,其基本上歸結爲一個類似的算法:

  1. 檢索目錄A和B,例如一個列表A.lstB.lst

  2. 創建兩個列表的intersection(例如cat A.lst B.lst | sort | uniq -d)。這是您需要實際比較的文件列表;你還必須遞歸地下降到任何目錄。

    您可能想看看shell支持的條件表達式(例如bash)或test命令。我也建議使用cmp而不是diff

    注意:您需要考慮在一側具有目錄而另一側具有相同名稱的另一個文件時適當的操作。

  3. 查找僅在目前A(例如cat A.lst B.lst B.lst | sort | uniq -u),並複製它們遞歸(cp -a)的文件B.

  4. 同樣地,發現僅在B存在和遞歸地將其複製到文件。

編輯:

我忘了提一個顯著的優化:如果你sort文件列表A.lstB.lst事先,你可以使用comm代替cat ... | sort | uniq ...執行組操作:

  • 交集:comm -12 A.sorted.lst B.sorted.lst

  • 文件只存在答:comm -23 A.sorted.lst B.sorted.lst

  • 文件只存在於B:comm -13 A.sorted.lst B.sorted.lst

+0

謝謝,將嘗試出來,並在工作時報告。 – 2012-07-28 19:52:29