0

2つの異なるパスでコンテンツを同期するbashシェルスクリプトを作成しようとしています。

私が目指しているアルゴリズムは、次の手順で構成されています

  1. 与えられた2つの完全な(相対的なパスではなく)パス
  2. 両方のパスの対応するディレクトリ内のファイル(ファイル名にはオプションでベース名とサフィックスが含まれる場合があります)を再帰的に比較します
  3. 対応するディレクトリまたはファイルが存在しない場合は、各ファイルを(フォルダのあるパスから)他の対応するフォルダにコピーします。

私はステップ1と2を理解しました

OLD_IFS=$IFS
# The extra space after is crucial
IFS=\

for old_file in `diff -rq old/ new/ | grep "^Files.*differ$" | sed 's/^Files \(.*\) and .* differ$/\1/'`
do
   mv $old_file $old_file.old
done
IFS=$OLD_IFS

ありがとう。

4

2 に答える 2

1

私はJavaで同様のアルゴリズムを実装しましたが、これは基本的に次のようになります。

  1. ディレクトリAとBのリストを取得します。例:A.lstB.lst

  2. 両方のリストの共通部分を作成します(例cat A.lst B.lst | sort | uniq -d)。これは、実際に比較する必要のあるファイルのリストです。また、任意のディレクトリに再帰的に降りる必要があります。

    シェル(たとえばbash)またはtestコマンドでサポートされている条件式を確認することをお勧めします。cmpまた、の代わりに使用することをお勧めしdiffます。

    注:一方にディレクトリがあり、もう一方に同じ名前のファイルがある場合は、適切なアクションを検討する必要があります。

  3. A(eg)にのみ存在するファイルを見つけて、cat A.lst B.lst B.lst | sort | uniq -uそれらを再帰的に(cp -a)Bにコピーします。

  4. 同様に、Bにのみ存在するファイルを見つけて、それらをAに再帰的にコピーします。

編集:

重要な最適化について言及するのを忘れましsortた。ファイルリストA.lstB.lst事前に作成しておくと、comm代わりにcat ... | sort | uniq ...設定操作を実行できます。

  • 交差点:comm -12 A.sorted.lst B.sorted.lst

  • Aにのみ存在するファイル:comm -23 A.sorted.lst B.sorted.lst

  • Bにのみ存在するファイル:comm -13 A.sorted.lst B.sorted.lst

于 2012-07-28T19:48:57.247 に答える
0

2つのディレクトリを同期するためのfind(これもあなたと同じアイデアを使用)に基づく既製のソリューション(シェルスクリプト)があります: https ://github.com/Fitus/Zaloha.sh 。

ドキュメントはここにあります:https ://github.com/Fitus/Zaloha.sh/blob/master/DOCUMENTATION.md 。

乾杯

于 2019-10-30T12:39:06.047 に答える