`rename` 命令从何而来?

gue*_*tli 17 command-line dpkg rename

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

user@host> dpkg -S /usr/bin/rename
dpkg-query: no path found matching pattern /usr/bin/rename
Run Code Online (Sandbox Code Playgroud)

Pil*_*ot6 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
Run Code Online (Sandbox Code Playgroud)

  • @guettli [feature](http://manpages.ubuntu.com/manpages/yakkety/en/man1/dpkg-query.1.html):“此命令不会列出维护者脚本创建的额外文件,也不会列出备择方案。” (5认同)
  • @guettli 参见 [Debian Bug #198220](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=198220)。如果`dpkg`/`dpkg-query` 方便地提供此信息,那将会很方便。但是,我不认为`dpkg -S` 应该*静默* 取消引用符号链接,直到它找到一个包文件。`dpkg -S foo` 不应该找到命令 `foo`,它会找到安装 *file* `foo` 的包,并且在使用文件的绝对路径调用时最有用。如果`dpkg -S /usr/bin/rename` 解释了为什么没有包提供该符号链接,那就太好了,但我认为它仍然应该说明没有包提供的事实。 (5认同)
  • 符号链接不属于包本身。 (2认同)
  • @guettli 因为这不是 `dpkg` 的工作。`dpkg` 只处理已安装的包。使用`update-alternatives --query rename`,它会显示解析的链接路径 (2认同)

ste*_*ver 12

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

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

您可以使用以下方法查看可选实现

$ update-alternatives --list rename
/usr/bin/file-rename
/usr/bin/prename
Run Code Online (Sandbox Code Playgroud)

并且可以使用

update-alternatives --config rename
Run Code Online (Sandbox Code Playgroud)

FWIWfile-renamerename包提供,而原始文件prename由其perl自身提供。来自apt-cache show rename

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

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


Ser*_*nyy 7

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

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
Run Code Online (Sandbox Code Playgroud)

在 Korn shell 及其衍生产品的情况下,rename是一个 shell 内置命令。

$ echo $SHELL
/bin/mksh

$ type rename
rename is a shell builtin
Run Code Online (Sandbox Code Playgroud)