语境 :
- btrfs 文件系统损坏(根树)后的 Debian 12 系统恢复试验,没有备份,但可以访问所有(?)文件。我在损坏后复制了系统,一切看起来都正确。我全新安装了 Debian 12。从这里,我
rsync
编辑了系统,除了/etc
. 对于最后一个,我rsync
只编辑了丢失的文件。 - 现在,我必须聪明地更新
/etc
。我想使用类似的工具meld
来让它变得更容易。但它不能作为 root 运行。所以我制作了旧版和新版的副本/etc
,并且chown -R user:user
都是从 LIVE DVD 中制作的。
当我的新版本etc
更新时,我想在替换整个/etc
新安装之前恢复文件/目录所有权。
这里的主题不是我的系统恢复,而是从具有相同文件和正确所有权的树副本恢复文件所有权。
ls -l
提供所有权但不提供完整路径。find
提供完整路径但不提供所有权。我最终找到了这个解决方案:
find previous_etc -exec sh -c 'chown -v --reference=$0 "new_etc${0#previous_etc}"' {} \;
所以,这是一个自我回答的问题。但如果你有其他方法,我很好奇。
mtree
专为该用例而设计。假设您的文件位于
etc
:并且您有文件的副本,但所有权和权限不正确
etc.new
:在此管道的左侧,我们
-c
为“Path”等“创建”mtree 规范-p
,而在右侧,我们在 stdin 上读取该规范并将其与 path etc.new 中的文件层次结构进行比较。Mtree 告诉我们许多文件“应该”(第一个值)但实际上是(第二个值):在管道的右侧,如果我们添加“更新”标志,mtree 实际上会进行更改,因此设置
-u
中文件的所有权和权限, 以便它们与以下中的参考文件匹配:etc.new
etc
事实上,
find etc etc.new -ls
确认它们现在是相同的: