はい
a/
2つのディレクトリがあり、ここに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
特に、互いに同じパスを持つファイルにのみ興味がある場合は、よりきれいにすることができます。線形時間で行うことも可能ですが、全体的な概念は実行可能です。