Trong trường hợp nào rename
lệnh đến từ đâu?
user@host> dpkg -S /usr/bin/rename
dpkg-query: no path found matching pattern /usr/bin/rename
prename
Trong trường hợp nào rename
lệnh đến từ đâu?
user@host> dpkg -S /usr/bin/rename
dpkg-query: no path found matching pattern /usr/bin/rename
prename
Câu trả lời:
Đáng ngạc nhiên, nó đến từ rename
gói.
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
không theo liên kết tượng trưng? Lỗi hay tính năng?
dpkg
là công việc. dpkg
chỉ giao dịch với các gói cài đặt. Sử dụng update-alternatives --query rename
, nó sẽ cho bạn thấy đường dẫn liên kết đã được giải quyết
dpkg
/ dpkg-query
cung cấp thông tin này một cách thuận tiện. Tuy nhiên, tôi không nghĩ dpkg -S
nên âm thầm liên kết biểu tượng cho đến khi tìm thấy tệp gói. dpkg -S foo
không cần tìm lệnh foo
, nó tìm gói đã cài đặt tệp foo
và hữu ích nhất khi được gọi với đường dẫn tuyệt đối của tệp. Sẽ tốt hơn nếu được dpkg -S /usr/bin/rename
giải thích tại sao không có gói nào cung cấp liên kết tượng trưng đó, nhưng tôi nghĩ nó vẫn nên nói sự thật rằng không có gói nào làm được.
Bạn có thể sẽ thấy rằng đó là một liên kết tượng trưng được quản lý bởi update-alternatives
cơ chế:
$ ls -l $(which rename)
lrwxrwxrwx 1 root root 24 Jun 29 2016 /usr/bin/rename -> /etc/alternatives/rename
Bạn có thể thấy các triển khai tùy chọn bằng cách sử dụng
$ update-alternatives --list rename
/usr/bin/file-rename
/usr/bin/prename
và có thể chọn giữa các triển khai bằng cách sử dụng
update-alternatives --config rename
FWIW file-rename
được cung cấp bởi rename
gói, trong khi bản gốc prename
được cung cấp bởi perl
chính nó. Từ apt-cache show rename
:
Gói này cung cấp cả giao diện perl để đổi tên tệp (File :: Rename) và công cụ dòng lệnh 'đổi tên' nhằm thay thế phiên bản hiện được cung cấp bởi gói perl.
Như thể điều này chưa đủ khó hiểu, bạn cũng có thể bắt gặp một gói khác rename
từ util-linux
gói - xem What với tất cả các tên được đổi?
Nếu chúng ta đang nói về /usr/bin/rename
, đó là một kịch bản perl khá tiện lợi, thì rename
lệnh thuộc về gói riêng của nó.
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
Trong trường hợp shell Korn và các dẫn xuất của nó, rename
là một lệnh tích hợp shell.
$ echo $SHELL
/bin/mksh
$ type rename
rename is a shell builtin
rename
lệnh, nhưng rename
không chỉ được nhắc đến /usr/bin/rename
, như bạn thấy trong câu trả lời của tôi. Người dùng có vỏ ksh hoặc mksh có thể không biết điều đó. Khi cá nhân tôi bắt đầu mksh
, tôi đã rất bối rối khi rename
không chấp nhận biểu hiện thông thường, cho đến khi tôi nhận ra đó là hai điều khác nhau. Ngoài ra, đừng hiểu lời tôi "Nếu chúng ta đang nói về x" theo nghĩa đen, hãy coi đó là cách nói "Trong trường hợp"
rename
tàu với Fedora là một khác nhau, mặc dù. Nó dường như là một chương trình được biên dịch và nó gần như không mạnh bằng các chương trìnhrename
đi kèm với Ubuntu. Vì vậy, hãy cẩn thận khi bạn sử dụng các tập lệnh trên một bản phân phối Linux khác.