![用相同的哈希值替换所有文件](https://linux22.com/image/2357/%E7%94%A8%E7%9B%B8%E5%90%8C%E7%9A%84%E5%93%88%E5%B8%8C%E5%80%BC%E6%9B%BF%E6%8D%A2%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6.png)
我想用 new.file 替换目标路径中与orignal.file同名且与orignal.file同名的所有文件。执行此操作的命令是什么?
假设我已经更新了文件的内容,现在我希望也更新特定路径中该文件的所有其他副本。
在大多数情况下,以下代码可以工作:
find /target_path/ -iname "original.file" -exec cp new.file '{}'
然而如果原始文件例如readme.txt,许多不相关的文件将被覆盖。
答案1
这需要在决定运行之前进行测试以查看校验和是否匹配cp
,您必须运行一个子shell作为-exec
要查找的参数。这应该可以完成这项工作:
find /target_path/ -iname "original.file" -exec bash -c \
'[[ $(md5sum "original.file") = $(md5sum "{}") ]] && cp "new.file" "{}"' \;
答案2
如果您可以制作文件硬链接的所有相同副本,那么对您来说会更容易。一种方法是使用复制品: 跑步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 {}
你没有说你的申请是什么;它可能有助于也可能没有帮助参与一致, 哪个进行远程同步时可以检测不同路径下的相同文件。