Откуда берется rename
команда?
user@host> dpkg -S /usr/bin/rename
dpkg-query: no path found matching pattern /usr/bin/rename
prename
Откуда берется rename
команда?
user@host> dpkg -S /usr/bin/rename
dpkg-query: no path found matching pattern /usr/bin/rename
prename
Ответы:
Удивительно, но это идет от 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
:
Этот пакет предоставляет как интерфейс perl для переименования файлов (File :: Rename), так и инструмент командной строки 'rename', предназначенный для замены версии, предоставляемой в настоящее время пакетом perl.
Как будто это уже не достаточно сбивало с толку, вы также можете столкнуться с еще одним rename
из util-linux
пакета - посмотрите, что со всеми переименованиями?
Если мы говорим о том /usr/bin/rename
, что это довольно изящный Perl-скрипт, то rename
команда принадлежит отдельному пакету.
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 и ее производных, rename
это встроенная команда оболочки.
$ echo $SHELL
/bin/mksh
$ type rename
rename is a shell builtin
rename
команде, но rename
не только упоминается /usr/bin/rename
, как вы видите в моем ответе. Пользователи, имеющие оболочки ksh или mksh, могут не знать об этом. Когда я лично начинал с mksh
, я был очень озадачен, когда rename
не принимал регулярное выражение, пока не понял, что это две разные вещи. Кроме того, не воспринимайте мои слова «Если мы говорим о х» буквально, считайте это способом сказать «В случае»
rename
то, что поставляется с Fedora, совсем другое. Похоже, что это скомпилированная программа, и она не такая мощная, как та,rename
которая поставляется с Ubuntu. Так что будьте осторожны при использовании скриптов в другом дистрибутиве Linux.