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