2017-05-03 70 views
0

例中的內容Bash腳本:merge dirA/ dirB/ dirDEST/是合併兩個目錄

在迪拉和DIRB所有現有文件(不是目錄)必須移到dirDEST。如果同名的兩個文件同時出現在dirA和dirB中,則移至dirDEST的文件必須是最近修改的文件,另一個必須保留在源目錄中。

當我有來自dirA和dirB(例如find /dirA -type ffind dirB/ -type f)的列表文件時,如何比較e選擇正確的文件並使用mv移動?

,文件的比較文件的修改時間,我可以使用:

if [ "$file1" -ot "$file2" ]; then 
    ... 
fi 
+2

不要重新發明輪子。 Google「rsync」 – fancyPants

+0

@fancyPants rsync的哪個選項實現合併? – ceving

回答

1

首先創建的所有文件的工會,然後再通過列表和檢查的三種情況

  • 文件中都存在目錄
  • 文件僅存在於兩個目錄之一中

這是一個沒有find的例子,只是使用globing。這意味着它僅適用於一個目錄級別。

#! /bin/bash 

union() 
{ 
    local f 
    for f in dir{A,B}/*; do 
    basename "$f" 
    done | 
    sort -u 
} 

for f in $(union); do 
    a="dirA/$f" 
    b="dirB/$f" 
    if [ -e "$a" ]; then 
    if [ -e "$b" ]; then 
     # file exists in dirA and dirB 
     if [ "$a" -nt "$b" ]; then 
     mv "$a" dirC/. 
     else 
     mv "$b" dirC/. 
     fi 
    else 
     # file exists in dirA but not in dirB 
     mv "$a" dirC/. 
    fi 
    else 
    # file exists in dirB but not in dirA 
    mv "$b" dirC/. 
    fi 
done