Звідки береться 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 для перейменування файлів (Файл :: Перейменувати), так і інструмент командного рядка «Перейменувати», який призначений замінити версію, що надається пакетом 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
У випадку оболонки Корна та його похідних 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.