2017-05-03 115 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