侧边栏壁纸
Linux入门自学网博主等级

每日学一条Linux命令,终成Linux大神

  • 累计撰写 725 篇文章
  • 累计创建 143 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Linux dpkg-divert命令教程:如何转移文件并避免冲突(附实例详解和注意事项)

Linux dpkg-divert命令介绍

dpkg-divert是一个用来设置和更新文件转移列表的工具。文件转移是一种强制dpkg(1)不将文件安装到其原本的位置,而是转移到另一个位置的方法。文件转移可以通过Debian包脚本来在文件发生冲突时将其移走。系统管理员也可以用它来覆盖某个包的配置文件,或者在安装一个包含这些文件的新版本的包时,让dpkg保留这些文件(这些文件不是被标记为“conffiles”的文件)。

Linux dpkg-divert命令适用的Linux版本

dpkg-divert命令主要适用于基于Debian的Linux发行版,如Ubuntu, Debian, Kali等。如果你使用的是其他的Linux发行版,如CentOS, Fedora, Arch等,你可能需要使用其他的包管理工具,如yum, dnf, pacman等,来处理文件转移的问题。不同的Linux命令可以以选项卡的形式展示,如下:

# Ubuntu/Debian/Kali
[linux@bashcommandnotfound.cn ~]$ dpkg-divert [option ...] command

# CentOS/Fedora
[linux@bashcommandnotfound.cn ~]$ yum install yum-utils
[linux@bashcommandnotfound.cn ~]$ yumdownloader [package]
[linux@bashcommandnotfound.cn ~]$ rpm -ivh --replacefiles [package].rpm

# Arch
[linux@bashcommandnotfound.cn ~]$ pacman -S pacman-contrib
[linux@bashcommandnotfound.cn ~]$ pacdiff [option ...]

Linux dpkg-divert命令的基本语法

dpkg-divert命令的基本语法格式如下:

dpkg-divert [option ...] command

Linux dpkg-divert命令的常用选项或参数说明

dpkg-divert命令的常用选项或参数说明如下表所示:

选项/参数说明
--add file添加一个文件的转移,file是要转移的文件的路径
--remove file移除一个文件的转移,file是要移除转移的文件的路径
--list [glob-pattern]列出所有的转移,或者匹配glob-pattern的转移
--listpackage file打印出转移file的包的名称,如果file是本地转移的,打印LOCAL,如果file没有被转移,什么都不打印
--truename file打印出一个被转移文件的真实名称
--divert divert-todivert-to是其他包提供的file的版本被转移到的位置
--local指定所有包的版本的这个文件都被转移,这意味着没有例外,无论安装了什么包,这个文件都被转移,这可以被管理员用来安装一个本地修改的版本
--package packagepackage是一个包的名称,它的file的副本不会被转移,即file只为除了package之外的所有包转移
--quiet安静模式,即不输出详细信息
--rename实际地将文件移走(或移回),如果目标文件已经存在,dpkg-divert会中止操作,这是非Essential包集合的文件转移的常见行为
--no-rename指定在添加或移除转移到数据库时,文件不应该被重命名,这是用于Essential包集合的文件转移的,因为原始文件的暂时消失是不可接受的,它可能会导致系统不可用
--test测试模式,即不实际执行任何改变,只是演示
-?, --help显示使用信息并退出

Linux dpkg-divert命令的实例

实例1:添加一个本地转移

如果我们想要将/usr/bin/ls命令转移到/usr/bin/ls.real,并安装一个自定义的ls命令,我们可以使用以下命令:

[linux@bashcommandnotfound.cn ~]$ sudo dpkg-divert --local --add --rename --divert /usr/bin/ls.real /usr/bin/ls
Adding 'local diversion of /usr/bin/ls to /usr/bin/ls.real'

这样,我们就可以将自定义的ls命令放到/usr/bin/ls,而不影响其他包提供的ls命令。

实例2:移除一个本地转移

如果我们想要恢复原来的/usr/bin/ls命令,我们可以使用以下命令:

[linux@bashcommandnotfound.cn ~]$ sudo dpkg-divert --local --remove --rename /usr/bin/ls
Removing 'local diversion of /usr/bin/ls to /usr/bin/ls.real'

这样,我们就可以将/usr/bin/ls.real移回到/usr/bin/ls,而不影响其他包提供的ls命令。

实例3:添加一个包转移

如果我们想要将一个包的文件转移,我们可以使用--package选项来指定这个包的名称。例如,如果我们想要将vim-tiny包的/usr/bin/vi命令转移到/usr/bin/vi.vim-tiny,并安装vim包的/usr/bin/vi命令,我们可以使用以下命令:

[linux@bashcommandnotfound.cn ~]$ sudo dpkg-divert --package vim-tiny --add --rename --divert /usr/bin/vi.vim-tiny /usr/bin/vi
Adding 'diversion of /usr/bin/vi to /usr/bin/vi.vim-tiny by vim-tiny'

这样,我们就可以安装vim包,而不会覆盖vim-tiny包的vi命令。

实例4:移除一个包转移

如果我们想要恢复一个包的文件转移,我们可以使用--package选项来指定这个包的名称。例如,如果我们想要恢复vim-tiny包的/usr/bin/vi命令,我们可以使用以下命令:

[linux@bashcommandnotfound.cn ~]$ sudo dpkg-divert --package vim-tiny --remove --rename /usr/bin/vi
Removing 'diversion of /usr/bin/vi to /usr/bin/vi.vim-tiny by vim-tiny'

这样,我们就可以卸载vim包,而不会影响vim-tiny包的vi命令。

实例5:列出所有的转移

如果我们想要查看系统中有哪些文件被转移了,我们可以使用--list选项来列出所有的转移。例如:

[linux@bashcommandnotfound.cn ~]$ dpkg-divert --list
diversion of /usr/bin/ls to /usr/bin/ls.real by local
diversion of /usr/bin/vi to /usr/bin/vi.vim-tiny by vim-tiny
diversion of /usr/share/man/man1/vi.1.gz to /usr/share/man/man1/vi.vim-tiny.1.gz by vim-tiny
diversion of /usr/share/man/man1/view.1.gz to /usr/share/man/man1/view.vim-tiny.1.gz by vim-tiny
diversion of /usr/share/man/man1/ex.1.gz to /usr/share/man/man1/ex.vim-tiny.1.gz by vim-tiny
diversion of /usr/share/man/man1/editor.1.gz to /usr/share/man/man1/editor.vim-tiny.1.gz by vim-tiny
diversion of /usr/bin/pager to /usr/bin/pager.distrib by local
diversion of /usr/bin/sensible-editor to /usr/bin/sensible-editor.distrib by local
diversion of /usr/bin/sensible-pager to /usr/bin/sensible-pager.distrib by local

我们可以看到,有些文件是被本地转移的。

实例6:列出匹配模式的转移

如果我们想要查看系统中有哪些文件被转移了,我们可以使用--list选项来列出所有的转移。如果我们想要只列出匹配某个模式的转移,我们可以使用glob-pattern参数来指定这个模式。例如,如果我们想要列出所有以vi开头的文件的转移,我们可以使用以下命令:

[linux@bashcommandnotfound.cn ~]$ dpkg-divert --list vi*
diversion of /usr/bin/vi to /usr/bin/vi.vim-tiny by vim-tiny
diversion of /usr/share/man/man1/vi.1.gz to /usr/share/man/man1/vi.vim-tiny.1.gz by vim-tiny
diversion of /usr/share/man/man1/view.1.gz to /usr/share/man/man1/view.vim-tiny.1.gz by vim-tiny
diversion of /usr/share/man/man1/ex.1.gz to /usr/share/man/man1/ex.vim-tiny.1.gz by vim-tiny
diversion of /usr/share/man/man1/editor.1.gz to /usr/share/man/man1/editor.vim-tiny.1.gz by vim-tiny

我们可以看到,有些文件是被vim-tiny包转移的,而不是被本地转移的。

实例7:打印出转移文件的包的名称

如果我们想要知道一个文件是被哪个包转移的,我们可以使用--listpackage选项来打印出这个包的名称。例如,如果我们想要知道/usr/bin/vi是被哪个包转移的,我们可以使用以下命令:

[linux@bashcommandnotfound.cn ~]$ dpkg-divert --listpackage /usr/bin/vi
vim-tiny

我们可以看到,/usr/bin/vi是被vim-tiny包转移的。

实例8:打印出一个被转移文件的真实名称

如果我们想要知道一个被转移文件的真实名称,我们可以使用--truename选项来打印出这个名称。例如,如果我们想要知道/usr/bin/vi的真实名称,我们可以使用以下命令:

[linux@bashcommandnotfound.cn ~]$ dpkg-divert --truename /usr/bin/vi
/usr/bin/vi.vim-tiny

我们可以看到,/usr/bin/vi的真实名称是/usr/bin/vi.vim-tiny。

实例9:测试模式

如果我们想要在添加或移除转移时,不实际执行任何改变,只是演示,我们可以使用--test选项来开启测试模式。例如,如果我们想要测试将/usr/bin/ls命令转移到/usr/bin/ls.real,但不实际执行,我们可以使用以下命令:

[linux@bashcommandnotfound.cn ~]$ sudo dpkg-divert --local --add --rename --divert /usr/bin/ls.real /usr/bin/ls --test
Adding 'local diversion of /usr/bin/ls to /usr/bin/ls.real'

我们可以看到,dpkg-divert会显示它将要做的操作,但不会实际执行。

实例10:安静模式

如果我们想要在添加或移除转移时,不输出详细信息,只是安静地执行,我们可以使用--quiet选项来开启安静模式。例如,如果我们想要安静地将/usr/bin/ls命令转移到/usr/bin/ls.real,我们可以使用以下命令:

[linux@bashcommandnotfound.cn ~]$ sudo dpkg-divert --local --add --rename --divert /usr/bin/ls.real /usr/bin/ls --quiet

我们可以看到,dpkg-divert不会输出任何信息,只是执行操作。

Linux dpkg-divert命令的注意事项

  • dpkg-divert命令需要root权限,所以我们需要使用sudo或者su来执行它。
  • dpkg-divert命令只能转移文件,不能转移目录或者符号链接。
  • dpkg-divert命令不会检查文件的内容,所以如果我们转移了一个文件,但是它的内容被修改了,dpkg-divert不会知道,也不会恢复它的原始内容。
  • dpkg-divert命令不会自动创建转移目标的目录,所以我们需要确保转移目标的目录存在,或者手动创建它。
  • dpkg-divert命令不会自动处理文件的依赖关系,所以我们需要注意转移文件可能会影响其他包的功能,或者导致一些错误。
  • 如果我们遇到了bash: dpkg-divert: command not found的错误,我们可以安装dpkg-dev包。
0

评论区