AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 775935
Accepted
lalebarde
lalebarde
Asked: 2024-05-06 18:12:59 +0800 CST2024-05-06 18:12:59 +0800 CST 2024-05-06 18:12:59 +0800 CST

如何在 Linux 上将文件所有权从参考 (/etc) 目录设置回副本?

  • 772

语境 :

  • 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}"' {}  \;

所以,这是一个自我回答的问题。但如果你有其他方法,我很好奇。

find
  • 1 1 个回答
  • 27 Views

1 个回答

  • Voted
  1. Best Answer
    Jim L.
    2024-05-09T04:06:32+08:002024-05-09T04:06:32+08:00

    mtree专为该用例而设计。

    假设您的文件位于etc:

    # cd /
    # find etc -ls
    553527   1 drwxr-xr-x    2 root    wheel       7 May  8 11:23 etc
    553434   1 -rw-------    1 nobody  wheel      29 May  8 11:23 etc/baz
    553214   1 -rwxr-xr-x    1 jim     wheel      29 May  8 11:23 etc/foo
    553433   1 -rw-------    1 jim     wheel      29 May  8 11:23 etc/stuff
    553431   1 -rw-------    1 root    nogroup    29 May  8 11:23 etc/bar
    553432   1 -rw-------    1 uucp    wheel      29 May  8 11:23 etc/farkle
    

    并且您有文件的副本,但所有权和权限不正确etc.new:

    # find etc.new -ls
    555768   1 drwx--x---    2 jim     jim         7 May  8 11:23 etc.new
    555771   1 -rwxrwxrwx    1 jim     jim        29 May  8 11:23 etc.new/stuff
    555772   1 -rwxrwxrwx    1 jim     jim        29 May  8 11:23 etc.new/bar
    555769   1 -rwxrwxrwx    1 jim     jim        29 May  8 11:23 etc.new/baz
    555773   1 -rwxrwxrwx    1 jim     jim        29 May  8 11:23 etc.new/farkle
    555770   1 -rwxrwxrwx    1 jim     jim        29 May  8 11:23 etc.new/foo
    

    在此管道的左侧,我们-c为“Path”等“创建”mtree 规范-p ,而在右侧,我们在 stdin 上读取该规范并将其与 path etc.new 中的文件层次结构进行比较。Mtree 告诉我们许多文件“应该”(第一个值)但实际上是(第二个值):

    # mtree -cp etc | mtree -p etc.new
    .:      user (0, 1001)
            gid (0, 1001)
            permissions (0755, 0710)
    stuff:  gid (0, 1001)
            permissions (0600, 0777)
    bar:    user (0, 1001)
            gid (65533, 1001)
            permissions (0600, 0777)
    baz:    user (65534, 1001)
            gid (0, 1001)
            permissions (0600, 0777)
    farkle: user (66, 1001)
            gid (0, 1001)
            permissions (0600, 0777)
    foo:    gid (0, 1001)
            permissions (0755, 0777)
    

    在管道的右侧,如果我们添加“更新”标志,mtree 实际上会进行更改,因此设置-u中文件的所有权和权限, 以便它们与以下中的参考文件匹配:etc.newetc

    # mtree -cp etc | mtree -up etc.new
    .:      user (0, 1001, modified)
            gid (0, 1001, modified)
            permissions (0755, 0710, modified)
    stuff:  gid (0, 1001, modified)
            permissions (0600, 0777, modified)
    bar:    user (0, 1001, modified)
            gid (65533, 1001, modified)
            permissions (0600, 0777, modified)
    baz:    user (65534, 1001, modified)
            gid (0, 1001, modified)
            permissions (0600, 0777, modified)
    farkle: user (66, 1001, modified)
            gid (0, 1001, modified)
            permissions (0600, 0777, modified)
    foo:    gid (0, 1001, modified)
            permissions (0755, 0777, modified)
    

    事实上,find etc etc.new -ls确认它们现在是相同的:

    # find etc etc.new -ls
    553527   1 drwxr-xr-x    2 root    wheel       7 May  8 11:23 etc
    553434   1 -rw-------    1 nobody  wheel      29 May  8 11:23 etc/baz
    553214   1 -rwxr-xr-x    1 jim     wheel      29 May  8 11:23 etc/foo
    553433   1 -rw-------    1 jim     wheel      29 May  8 11:23 etc/stuff
    553431   1 -rw-------    1 root    nogroup    29 May  8 11:23 etc/bar
    553432   1 -rw-------    1 uucp    wheel      29 May  8 11:23 etc/farkle
    555768   1 drwxr-xr-x    2 root    wheel       7 May  8 11:23 etc.new
    555771   1 -rw-------    1 jim     wheel      29 May  8 11:23 etc.new/stuff
    555772   1 -rw-------    1 root    nogroup    29 May  8 11:23 etc.new/bar
    555769   1 -rw-------    1 nobody  wheel      29 May  8 11:23 etc.new/baz
    555773   1 -rw-------    1 uucp    wheel      29 May  8 11:23 etc.new/farkle
    555770   1 -rwxr-xr-x    1 jim     wheel      29 May  8 11:23 etc.new/foo
    
    • 1

相关问题

  • 如果未引用 -name 后面的模式,则 find 的奇怪行为

  • 将变量从子shell打印到父shell [重复]

  • 检查某个文件夹是否存在于某个目录中

  • 从命令行查找和替换 CSS 文件中的颜色

  • GNU find:在-exec中获取绝对和相对路径

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve