ターゲットパスで、ソース.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 {}
あなたの申請書が何であるかを明らかにしませんでした。参加に役立つかもしれませんし、そうでないかもしれません。一貫した、どちらリモート同期中に異なるパスにある同じファイルを検出できます。。