合并两个目录

时间:2017-05-03 11:27:08

标签: bash shell command-line

示例:merge dirA/ dirB/ dirDEST/

dirA和dirB中的所有现有文件(不是目录)必须移动到dirDEST。如果dirA和dirB中同时出现两个同名文件,则移动到dirDEST的文件必须是最近修改过的文件,另一个必须保留在源目录中。

当我有来自dirA和dirB的列表文件(例如find /dirA -type ffind dirB/ -type f)时,如何比较e选择正确的文件并使用mv移动?

对于我可以使用的文件的比较修改时间:

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

1 个答案:

答案 0 :(得分: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
相关问题