例子

例子

例子

假设我有 2 个目录a/b/.假设它们包含以下文件:

a/
a/foo/1
a/bar/2
a/baz/3

b/
b/foo/1
b/bar/2

使得a/foo/1b/foo/1相同但a/bar/2不同b/bar/2

a/合并到后b/,我想得到:

a/
a/bar/2

b/
b/foo/1
b/bar/2
b/baz/3

解释

  • a/foo/b/foo/(递归地)相同,所以我们删除a/foo/.
  • a/bar/2b/bar/2不同,所以我们什么也不做。
  • a/baz/只存在于 中a/但不存在于 中b/,因此我们将其移至b/baz/

有现成的 shell 命令吗?我有一种感觉,rsync可能有用,但我不熟悉rsync

答案1

不能说我知道可以为您执行此操作的特定命令。但您可以仅使用散列来完成此操作。

下面是一个简单的例子:

#!/bin/bash

# ...some stuff to get the files...

# Get hashes for all source paths
for srcFile in "${srcFileList[@]}"
do
  srcHashList+="$(md5sum "$srcFile")"
done

# Get hashes for all destination paths
for dstFile in "${dstFileList[@]}"
do
  dstHashList+="$(md5sum "$dstFile")"
done

# Compare hashes, exclude identical files, regardless of their path.
for srci in "${!srcHashList[@]}"
do
  for dsti in "${!dstHashList[@]}"
  do
    match=0
    if [ "${srcHashList[$srci]}" == "${dstHashList[$dsti]}" ]
    then
      match=1
    fi
    if [ $match != 1 ]
    then
      newSrcList+=${srcFileList[$srci]}
      newDstList+=${dstFileList[$dsti]}
    fi
  done
done
# ...move files after based on the new lists

这绝对可以做得更干净,特别是如果您只关心彼此路径相同的文件。也可能在线性时间内完成,但总体概念是可行的。

相关内容