ターゲットパス内のすべてのファイルをoriginal.fileと同じ名前で、orignal.fileと同じハッシュをnew.fileで置き換えたい。これを行うためのコマンドは何ですか?
ファイルの内容を更新し、特定のパスにあるそのファイルの他のすべてのコピーも更新したいとします。
ほとんどの場合、次のコードが機能します。
find /target_path/ -iname "original.file" -exec cp new.file '{}'
ただし、たとえばoriginal.fileがreadme.txtの場合、無関係なファイルの多くが上書きされます。
これには、cp
の実行を決定する前に、チェックサムが一致するかどうかを確認するためのテストが必要です。検索するには、-exec
引数としてサブシェルを実行する必要があります。これでうまくいくはずです:
find /target_path/ -iname "original.file" -exec bash -c \
'[[ $(md5sum "original.file") = $(md5sum "{}") ]] && cp "new.file" "{}"' \;
ファイルのすべての同一のコピーをハードリンクにできると、より簡単になります。これを行う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 、 リモート同期を実行するときに異なるパスで同一のファイルを検出できる を含めると役立つ場合とそうでない場合があります。