すべてのファイルを同じハッシュ値に置き換える

すべてのファイルを同じハッシュ値に置き換える

ターゲットパスで、ソース.fileと同じ名前を持ち、ソース.fileと同じ名前を持つすべてのファイルをnew.fileに置き換えたいと思います。これを行うコマンドは何ですか?

ファイルの内容を更新し、特定のパスにあるそのファイルの他のすべてのコピーも更新したいとします。

ほとんどの場合、次のコードが機能します。

find /target_path/ -iname "original.file" -exec cp new.file '{}' 

しかし、オリジナルファイルたとえば、 readme.txt を使用すると、無関係なファイルが多く上書きされます。

答え1

これを行うには、実行を決定する前にチェックサムが一致するかどうかをテストし、検索引数cpでサブシェルを実行する必要があります。-execこれを行う必要があります。

find /target_path/ -iname "original.file" -exec bash -c \
  '[[ $(md5sum "original.file") = $(md5sum "{}") ]] && cp "new.file" "{}"' \;

答え2

ファイルハードリンクの同じコピーをすべて作成できる場合は、簡単になります。 1つの方法は次のとおりです。レプリカ:ランニングfdupes -L。その後、ファイルを変更すると、ハードリンクが維持されます。

名前と内容、または名前とハッシュでのみファイルを見つけるには、コマンドに別の条件を追加するだけですfind

find /target_path/ -iname "original.file" -exec cmp old.file {} -exec cp new.file {}
find /target_path/ -iname "original.file" \
                   -exec sh -c 'test "$(md5sum | sed "s/ .*//")" = "$1" <"$0"' {} "$(cat old.md5sum)" \
                   -exec cp new.file {}

あなたの申請書が何であるかを明らかにしませんでした。参加に役立つかもしれませんし、そうでないかもしれません。一貫した、どちらリモート同期中に異なるパスにある同じファイルを検出できます。

関連情報