Answers:
令人惊讶的是,它来自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
dpkg -S
遵循符号链接?错误或功能?
dpkg
工作。dpkg
仅处理已安装的软件包。使用update-alternatives --query rename
,它将为您显示已解析的链接路径
dpkg
/ dpkg-query
方便地提供此信息,将很方便。不过,我不认为dpkg -S
应该默默地解引用符号链接,直到它找到一个文件包。dpkg -S foo
不应该找到命令foo
,而是找到安装文件 的软件包foo
,并且在使用文件的绝对路径调用时最有用。如果能dpkg -S /usr/bin/rename
解释为什么没有软件包提供该符号链接会很好,但是我认为它应该说出没有软件包提供的事实。
您可能会发现它是由该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-rename
由rename
包装提供,而原件prename
由perl
自己提供。来自apt-cache show rename
:
该软件包提供了用于重命名文件(File :: Rename)的perl接口和命令行工具“ rename”,该工具旨在替换perl软件包当前提供的版本。
好像这还不够令人困惑,您可能还会rename
在util-linux
软件包中遇到另一个问题-请参阅所有重命名是什么?
如果我们正在谈论/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
rename
命令,但正如您在我的答案中看到的那样,它rename
不仅被提及/usr/bin/rename
。具有ksh或mksh shell的用户可能不知道这一点。当我个人开始时mksh
,当我rename
不接受正则表达式时感到非常困惑,直到我意识到这是两回事。另外,请不要直言我的话“如果我们在谈论x”,
rename
,Fedora附带的是另一种。它似乎是一个已编译的程序,功能不如rename
Ubuntu附带的功能强大。因此,在其他Linux发行版上使用脚本时要小心。