web-dev-qa-db-ja.com

すべてのファイルを同一のハッシュに置き換えます

ターゲットパス内のすべてのファイルをoriginal.fileと同じ名前で、orignal.fileと同じハッシュをnew.fileで置き換えたい。これを行うためのコマンドは何ですか?

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

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

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

ただし、たとえばoriginal.fileがreadme.txtの場合、無関係なファイルの多くが上書きされます。

2
svandragt

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

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

ファイルのすべての同一のコピーをハードリンクにできると、より簡単になります。これを行う1つの方法は、 fdupes :run 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 {}

あなたはあなたのアプリケーションが何であるかを言いません。 nisonリモート同期を実行するときに異なるパスで同一のファイルを検出できる を含めると役立つ場合とそうでない場合があります。