【问题标题】:Bash scripts that merge the contents of two directories合并两个目录内容的 Bash 脚本
【发布时间】:2017-05-03 11:27:08
【问题描述】:

示例: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

【问题讨论】:

  • 不要重新发明轮子。谷歌“rsync”
  • @fancyPants rsync 的哪个选项实现了合并?

标签: bash shell command-line


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-09
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    相关资源
    最近更新 更多