“重命名”命令从何而来?


17

哪里的rename命令是从哪里来的?

user@host> dpkg -S /usr/bin/rename
dpkg-query: no path found matching pattern /usr/bin/rename

3
但是rename,Fedora附带的是另一种。它似乎是一个已编译的程序,功能不如renameUbuntu附带的功能强大。因此,在其他Linux发行版上使用脚本时要小心。
Martin Ueding

@MartinUeding您能在这里留言

Answers:


20

令人惊讶的是,它来自rename包装。

pilot6@Pilot6:~$ ls -l /usr/bin/rename
lrwxrwxrwx 1 root root 24 окт 17  2013 /usr/bin/rename -> /etc/alternatives/rename
pilot6@Pilot6:~$ ls -l /etc/alternatives/rename
lrwxrwxrwx 1 root root 20 апр 29  2016 /etc/alternatives/rename -> /usr/bin/file-rename
pilot6@Pilot6:~$ dpkg -S /usr/bin/file-rename
rename: /usr/bin/file-rename

1
为什么不dpkg -S遵循符号链接?错误或功能?
guettli

5
@guettli 功能:“此命令将不会列出由维护者脚本创建的其他文件,也不会列出替代方案。”
muru

2
符号链接不属于包本身。
飞行员

2
@guettli,因为这不是dpkg工作。dpkg仅处理已安装的软件包。使用update-alternatives --query rename ,它将为您显示已解析的链接路径
Sergiy Kolodyazhnyy

5
@guettli请参阅Debian Bug#198220。如果dpkg/ dpkg-query方便地提供此信息,将很方便。不过,我不认为dpkg -S应该默默地解引用符号链接,直到它找到一个文件包。dpkg -S foo不应该找到命令foo,而是找到安装文件 的软件包foo,并且在使用文件的绝对路径调用时最有用。如果能dpkg -S /usr/bin/rename解释为什么没有软件包提供该符号链接会很好,但是我认为它应该说出没有软件包提供的事实。
伊莱亚·卡根

12

您可能会发现它是由该update-alternatives机制管理的符号链接:

$ ls -l $(which rename)
lrwxrwxrwx 1 root root 24 Jun 29  2016 /usr/bin/rename -> /etc/alternatives/rename

您可以使用查看可选实现

$ update-alternatives --list rename
/usr/bin/file-rename
/usr/bin/prename

并可以使用

update-alternatives --config rename

FWIW file-renamerename包装提供,而原件prenameperl自己提供。来自apt-cache show rename

该软件包提供了用于重命名文件(File :: Rename)的perl接口和命令行工具“ rename”,该工具旨在替换perl软件包当前提供的版本。

好像这还不够令人困惑,您可能还会renameutil-linux软件包中遇到另一个问题-请参阅所有重命名是什么?


为什么不能将named.ul用作替代重命名?
Random832 '17

@ Random832对于命令行实用程序,替代品应该是彼此的语法兼容替代品(至少对于某些功能的通用核心而言);named.ul和姓氏不符合条件。
zwol

7

如果我们正在谈论/usr/bin/rename,这是一个非常漂亮的perl脚本,那么rename command属于其自己的单独程序包。

rename:
  Installed: 0.20-4
  Candidate: 0.20-4
  Version table:
 *** 0.20-4 500
        500 http://archive.ubuntu.com/ubuntu xenial/main amd64 Packages
        500 http://archive.ubuntu.com/ubuntu xenial/main i386 Packages
        100 /var/lib/dpkg/status

对于Korn shell及其派生类,rename是shell内置命令。

$ echo $SHELL
/bin/mksh

$ type rename
rename is a shell builtin

为什么是“如果我们正在谈论/ usr / bin / rename”?问题包含绝对路径。
guettli

1
@guettli这个问题询问rename命令,但正如您在我的答案中看到的那样,它rename不仅被提及/usr/bin/rename。具有ksh或mksh shell的用户可能不知道这一点。当我个人开始时mksh,当我rename不接受正则表达式时感到非常困惑,直到我意识到这是两回事。另外,请不要直言我的话“如果我们在谈论x”,
则应
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.