Откуда берется команда `rename`?

17

Откуда берется renameкоманда?

user@host> dpkg -S /usr/bin/rename
dpkg-query: no path found matching pattern /usr/bin/rename
guettli
источник
3
Однако, renameто, что поставляется с Fedora, совсем другое. Похоже, что это скомпилированная программа, и она не такая мощная, как та, renameкоторая поставляется с Ubuntu. Так что будьте осторожны при использовании скриптов в другом дистрибутиве Linux.
Мартин Уединг,
@MartinUeding Вы можете оставить комментарий здесь: askubuntu.com/questions/873661/…
guettli
Этот ответ говорит, что этоprename
Gallifreyan

Ответы:

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
Pilot6
источник
1
Почему dpkg -Sне идет по символической ссылке? Баг или фича?
Геттли
5
@guettli особенности : «Эта команда не будет список дополнительных файлов , созданных сценариями сопровождающих, и не будет список альтернатив.»
Муру
2
Симлинк не относится к самому пакету.
Pilot6
2
@guettli, потому что это не dpkgработа. dpkgимеет дело только с установленными пакетами. Используйте update-alternatives --query rename , это покажет вам разрешенный путь ссылки
Сергей Колодяжный
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-renameпредоставляется renameпакетом, тогда как оригинал prenameпредоставляется отдельно perl. От apt-cache show rename:

Этот пакет предоставляет как интерфейс perl для переименования файлов (File :: Rename), так и инструмент командной строки 'rename', предназначенный для замены версии, предоставляемой в настоящее время пакетом perl.

Как будто это уже не достаточно сбивало с толку, вы также можете столкнуться с еще одним renameиз util-linuxпакета - посмотрите, что со всеми переименованиями?

steeldriver
источник
Почему rename.ul не доступен в качестве альтернативы переименования?
Random832
@ Random832 Для утилит командной строки предполагается, что альтернативы являются совместимыми по синтаксису заменами друг друга (по крайней мере, для некоторого общего ядра функциональности); rename.ul и prename не имеют права.
Звол
7

Если мы говорим о том /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
Сергей Колодяжный
источник
Почему «Если мы говорим о / usr / bin / rename»? Вопрос содержит абсолютный путь.
Геттли
1
@guettli Вопрос спрашивает о renameкоманде, но renameне только упоминается /usr/bin/rename, как вы видите в моем ответе. Пользователи, имеющие оболочки ksh или mksh, могут не знать об этом. Когда я лично начинал с mksh, я был очень озадачен, когда renameне принимал регулярное выражение, пока не понял, что это две разные вещи. Кроме того, не воспринимайте мои слова «Если мы говорим о х» буквально, считайте это способом сказать «В случае»
Сергей Колодяжный