Da dove viene il rename
comando?
user@host> dpkg -S /usr/bin/rename
dpkg-query: no path found matching pattern /usr/bin/rename
prename
Da dove viene il rename
comando?
user@host> dpkg -S /usr/bin/rename
dpkg-query: no path found matching pattern /usr/bin/rename
prename
Risposte:
Sorprendentemente, viene dal rename
pacchetto.
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
non segue il collegamento simbolico? Bug o funzionalità?
dpkg
è il lavoro. dpkg
si occupa solo di pacchetti installati. Usa update-alternatives --query rename
, ti mostrerà il percorso del collegamento risolto
dpkg
/ dpkg-query
offrissi queste informazioni comodamente. Tuttavia, non penso che dpkg -S
dovrebbe silenziosamente fare la dereference symlink fino a quando non trova un file di pacchetto. dpkg -S foo
non dovrebbe trovare il comando foo
, trova il pacchetto che ha installato il file foo
ed è molto utile quando viene invocato con il percorso assoluto di un file. Sarebbe bello se dpkg -S /usr/bin/rename
spiegato perché nessun pacchetto fornisce quel link simbolico, ma penso che dovrebbe ancora dire la verità che nessun pacchetto lo fa.
Probabilmente scoprirai che si tratta di un collegamento simbolico gestito dal update-alternatives
meccanismo:
$ ls -l $(which rename)
lrwxrwxrwx 1 root root 24 Jun 29 2016 /usr/bin/rename -> /etc/alternatives/rename
Puoi vedere le implementazioni opzionali usando
$ update-alternatives --list rename
/usr/bin/file-rename
/usr/bin/prename
e può scegliere tra implementazioni usando
update-alternatives --config rename
FWIW file-rename
è fornito dal rename
pacchetto, mentre l'originale prename
è fornito da perl
solo. Da apt-cache show rename
:
Questo pacchetto fornisce sia un'interfaccia perl per rinominare i file (File :: Rinomina) sia uno strumento da riga di comando 'rinomina' che ha lo scopo di sostituire la versione attualmente fornita dal pacchetto perl.
Come se ciò non fosse già abbastanza confuso, potresti anche imbatterti in un altro rename
dal util-linux
pacchetto - vedi Cosa c'è con tutti i rinominati?
Se stiamo parlando /usr/bin/rename
, che è uno script perl piuttosto elegante, allora il rename
comando appartiene al suo pacchetto separato.
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
Nel caso della shell Korn e dei suoi derivati, rename
è un comando incorporato della shell.
$ echo $SHELL
/bin/mksh
$ type rename
rename is a shell builtin
rename
comando, ma rename
non si fa solo riferimento /usr/bin/rename
, come vedi nella mia risposta. Gli utenti che hanno shell ksh o mksh potrebbero non esserne consapevoli. Quando ho iniziato personalmente con mksh
me, ero molto sconcertato quando rename
non accettavo l'espressione regolare, fino a quando ho capito che erano due cose diverse. Inoltre, non prendere le mie parole "Se stiamo parlando di x" letteralmente, consideralo come un modo di dire "In caso di"
rename
quello fornito con Fedora è diverso. Sembra essere un programma compilato e non è così potente comerename
quello fornito con Ubuntu. Quindi fai attenzione quando usi gli script su una diversa distribuzione Linux.