例

2 つのディレクトリa/とがあるとしますb/。これらのディレクトリには次のファイルが含まれているとします。

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

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

つまり、a/foo/1と はb/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/2異なっているのでb/bar/2、何もしません。
  • a/baz/は にのみ存在しますa/が には存在しないb/ため、 に移動しますb/baz/

これには既製のシェル コマンドがありますか?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

これは、特に互いに同一のパスを持つファイルのみを対象とする場合には、間違いなくよりクリーンに実行できます。線形時間で実行できる可能性もありますが、一般的な概念は機能します。

関連情報