Nắm bắt được sức mạnh đổi tên tệp của thế giới Linux và cho lệnh mv
. Lệnh Rename
linh hoạt, nhanh chóng và đôi khi còn dễ dàng hơn. Đây là hướng dẫn về sức mạnh của lệnh này.
Mục lục
Điều gì sai với lệnh mv
?
Không có gì sai với mv
. Lệnh này thực hiện rất tốt công việc và nó được tìm thấy trên tất cả các bản phân phối Linux, trong macOS và trong các hệ điều hành giống Unix khác. Vì vậy, nó luôn có sẵn. Nhưng đôi khi bạn chỉ cần một chiếc máy ủi chứ không cần một cái xẻng.
Các lệnh mv
có một mục đích trong cuộc sống, và đó là để di chuyển các file. Đó là một tác dụng phụ đáng mừng là nó có thể được sử dụng để di chuyển một tệp hiện có sang một tệp mới, với một tên mới. Hiệu quả thực sự là đổi tên tệp, vì vậy chúng tôi có được những gì chúng tôi muốn. Nhưng mv
không phải là một công cụ đổi tên tệp chuyên dụng.
Đổi tên một tệp đơn bằng mv
Sử dụng mv
để đổi tên loại tệp mv
, khoảng trắng, tên tệp, khoảng trắng và tên mới mà bạn muốn tệp có. Sau đó nhấn Enter.
Bạn có thể sử dụng ls
để kiểm tra tệp đã được đổi tên.
mv oldfile.txt newfile.txt
ls * .txt
Đổi tên nhiều tệp bằng mv
Mọi thứ trở nên phức tạp hơn khi bạn muốn đổi tên nhiều tệp. mv
không có khả năng đối phó với việc đổi tên nhiều tệp. Bạn phải sử dụng một số thủ thuật Bash tiện lợi. Điều đó là tốt nếu bạn biết một số dòng lệnh cấp trung bình, nhưng sự phức tạp của việc đổi tên nhiều tệp bằng các mv
chữ viết tắt hoàn toàn trái ngược với sự dễ dàng sử dụng mv
để đổi tên một tệp.
Mọi thứ leo thang nhanh chóng.
Giả sử chúng ta có một thư mục với nhiều loại tệp trong đó, thuộc các loại khác nhau. Một số tệp này có phần mở rộng “.prog”. Chúng tôi muốn đổi tên chúng tại dòng lệnh để chúng có phần mở rộng “.prg”.
Làm thế nào để mv
nỗ lực làm điều đó cho chúng ta? Chúng ta hãy xem xét các tập tin.
ls * .prog -l
Đây là một cách để làm điều đó mà không cần viết tệp Bash script thực tế.
for f in *.prog; do mv -- "$f" "${f%.prog}.prg"
Cho rằng nó hoạt động? Hãy kiểm tra các tập tin và xem.
ls * .pr *
Vì vậy, có, nó đã hoạt động. Tất cả chúng đều là tệp “.prg” và không có tệp “.prog” nào trong thư mục.
Chuyện gì vừa xảy ra?
Lệnh dài đó thực sự làm gì? Hãy phá vỡ nó.
for f in *.prog; do mv -- "$f" "${f%.prog}.prg"
Phần đầu tiên bắt đầu một vòng lặp sẽ lần lượt xử lý từng tệp “.prog” trong thư mục.
Phần tiếp theo cho biết quá trình xử lý sẽ làm gì . Nó đang sử dụng mv
để di chuyển từng tệp sang tệp mới. Tệp mới sẽ được đặt tên với tên của tệp gốc ngoại trừ phần “.prog”. Thay vào đó, phần mở rộng mới của “.prg” sẽ được sử dụng.
Phải có một cách đơn giản hơn
Chắc chắn nhất. Đó là lệnh rename
.
rename
không phải là một phần của bản phân phối Linux tiêu chuẩn, vì vậy bạn sẽ cần phải cài đặt nó. Nó cũng có một tên khác trong các dòng Linux khác nhau, nhưng chúng đều hoạt động theo cùng một cách. Bạn sẽ chỉ phải thay thế tên lệnh thích hợp theo hương vị Linux mà bạn đang sử dụng.
trong các bản phân phối bắt nguồn từ Ubuntu và Debian mà bạn cài đặt rename
như thế này:
sudo apt-get install rename
Trong các bản phân phối có nguồn gốc từ Fedora và RedHat, bạn cài đặt prename
như thế này. Lưu ý chữ “p” đầu tiên là viết tắt của Perl.
sudo dnf install prename
Để cài đặt nó trong Manjaro Linux, hãy sử dụng lệnh sau. Lưu ý rằng lệnh đổi tên được gọi perl-rename
.
sudo pacman -Syu perl-rename
Hãy làm điều đó một lần nữa
Và lần này chúng tôi sẽ sử dụng rename
. Chúng tôi sẽ quay ngược đồng hồ để chúng tôi có một tập hợp các tệp “.prog”.
ls * .prog
Bây giờ chúng ta hãy sử dụng lệnh sau để đổi tên chúng. Sau đó, chúng tôi sẽ kiểm tra ls
xem nó có hoạt động hay không. Hãy nhớ thay thế rename
bằng tên lệnh thích hợp cho Linux của bạn nếu bạn không sử dụng Ubuntu hoặc Linux có nguồn gốc từ Debian.
rename 's/.prog/.prg/' *.prog
ls * .pr *
Điều đó đã hiệu quả, hiện tại chúng đều là tệp “.prg” và không còn tệp “.prog” nào trong thư mục.
Điều gì đã xảy ra ?
Hãy giải thích điều kỳ diệu đó trong ba phần.
Phần đầu tiên là tên lệnh, rename
(hoặc prename
hoặc perl-rename
đối với các bản phân phối khác).
Phần cuối cùng là *.prog
, yêu rename
cầu hoạt động trên tất cả các tệp “.prog”.
Phần giữa xác định công việc chúng ta muốn thực hiện trên mỗi tên tệp. Phương tiện s
là thay thế. Từ đầu tiên ( .prog
) là những gì rename
sẽ tìm kiếm trong mỗi tên tệp và từ thứ hai ( .prg
) là những gì nó sẽ được thay thế bằng.
Phần giữa của lệnh, hoặc biểu thức trung tâm, là ‘ biểu thức chính quy ‘ Perl và nó là thứ mang lại rename
tính linh hoạt cho lệnh.
Thay đổi các phần khác của tên tệp
Chúng tôi đã thay đổi phần mở rộng tên tệp cho đến nay, hãy sửa đổi các phần khác của tên tệp.
Trong thư mục có rất nhiều tệp mã nguồn C. Tất cả các tên tệp đều có tiền tố là “slang_”. Chúng tôi có thể kiểm tra điều này với ls
.
ls sl * .c
Chúng tôi sẽ thay thế tất cả các lần xuất hiện của “slang_” bằng “sl_”. Định dạng của lệnh đã quen thuộc với chúng ta. Chúng tôi chỉ thay đổi cụm từ tìm kiếm, cụm từ thay thế và loại tệp.
rename 's/slang_/sl_' *.c
Lần này, chúng tôi đang tìm kiếm các tệp “.c” và tìm kiếm “slang_”. Bất cứ khi nào “slang_” được tìm thấy trong tên tệp, nó sẽ được thay thế bằng “sl_”.
Chúng ta có thể kiểm tra kết quả của lệnh đó bằng cách lặp lại ls
lệnh từ trên với các tham số tương tự:
ls sl * .c
Xóa một phần của tên tệp
Chúng tôi có thể xóa một phần của tên tệp bằng cách thay thế cụm từ tìm kiếm bằng không.
ls *.c
rename 's/sl_//' *.c
ls *.c
Từ ls
lệnh, chúng ta có thể thấy rằng các tệp “.c” của chúng ta đều được thêm vào trước bằng “sl_”. Hãy loại bỏ điều đó hoàn toàn.
Các lệnh rename
sau định dạng tương tự như trước đây. Chúng tôi sẽ tìm kiếm các tệp “.c”. Cụm từ tìm kiếm là “sl_”, nhưng không có cụm từ thay thế. Hai dấu gạch chéo ngược mà không có bất cứ thứ gì giữa chúng có nghĩa là không có gì, một chuỗi rỗng.
rename
sẽ xử lý lần lượt từng tệp “.c”. Nó sẽ tìm kiếm “sl_” trong tên tệp. Nếu nó được tìm thấy, nó sẽ được thay thế bằng không. Nói cách khác, cụm từ tìm kiếm sẽ bị xóa.
Việc sử dụng ls
lệnh thứ hai xác nhận rằng tiền tố “sl_” đã bị xóa khỏi mọi tệp “.c”.
Giới hạn các thay đổi đối với các phần cụ thể của tên tệp
Hãy sử dụng ls
để xem các tệp có chuỗi “param” trong tên tệp của chúng. Sau đó, chúng tôi sẽ sử dụng rename
để thay thế chuỗi đó bằng chuỗi “tham số”. Chúng tôi sẽ sử dụng ls
một lần nữa để xem hiệu ứng của rename
lệnh trên các tệp đó.
ls *param*
rename 's/param/parameter' *.c
ls *param*
Bốn tệp được tìm thấy có “param” trong tên tệp của chúng. param.c, param_one.c và param_two.c đều có “param” ở đầu tên của chúng. third_param.c có “param” ở cuối tên của nó, ngay trước phần mở rộng.
Các lệnh rename
đang diễn ra để tìm kiếm “param” ở khắp mọi nơi trong tên tập tin, và thay thế bằng “thông số” trong mọi trường hợp.
Việc sử dụng ls
lệnh thứ hai cho chúng ta thấy rằng đó chính xác là những gì đã xảy ra. Cho dù “param” ở đầu hay cuối tên tệp, nó đã được thay thế bằng “parameter”.
Chúng ta có thể sử dụng siêu ký tự của Perl để tinh chỉnh hành vi của biểu thức giữa. Siêu ký tự là ký hiệu đại diện cho vị trí hoặc trình tự của các ký tự. Ví dụ: ^
có nghĩa là “bắt đầu của một chuỗi”, $
có nghĩa là “kết thúc của một chuỗi” và .
có nghĩa là bất kỳ ký tự đơn lẻ nào (ngoài ký tự dòng mới).
Chúng tôi sẽ sử dụng phần bắt đầu của chuỗi metacharacter ( ^
) để hạn chế tìm kiếm của chúng tôi ở phần đầu của tên tệp.
ls *param*.c
rename 's/^parameter/value/' *.c
ls *param*.c
ls value*.c
Các tệp chúng tôi đã đổi tên trước đó được liệt kê và chúng ta có thể thấy chuỗi “parameter” ở đầu ba tên tệp và nó ở cuối một trong các tên tệp.
Lệnh rename
của chúng tôi sử dụng (^
siêu ký tự đầu dòng ) trước cụm từ tìm kiếm “parameter”. Điều này cho biết rename
chỉ xem xét cụm từ tìm kiếm đã được tìm thấy nếu nó nằm ở đầu tên tệp. Chuỗi tìm kiếm “tham số” sẽ bị bỏ qua nếu nó nằm ở bất kỳ vị trí nào khác trong tên tệp.
Kiểm tra với ls
, chúng ta có thể thấy rằng tên tệp có “parameter” ở cuối tên tệp chưa được sửa đổi, nhưng ba tên tệp có “parameter” ở đầu tên của chúng đã có chuỗi tìm kiếm được thay thế bằng cụm từ thay thế “value”
Sức mạnh của sự rename
nằm trong sức mạnh của Perl. Tất cả sức mạnh của Perl là do bạn sử dụng.
Tìm kiếm với các nhóm
rename
đã có thêm nhiều thủ thuật lên tay áo của nó. Hãy xem xét trường hợp bạn có thể có các tệp có các chuỗi tương tự trong tên của chúng. Chúng không hoàn toàn là các chuỗi giống nhau, vì vậy, tìm kiếm và thay thế đơn giản sẽ không hoạt động ở đây.
Trong ví dụ này, chúng tôi sử dụng ls
để kiểm tra tệp chúng tôi có bắt đầu bằng “str”. Có hai trong số chúng, string.c và Strale.c. Chúng ta có thể đổi tên cả hai chuỗi cùng một lúc bằng kỹ thuật gọi là nhóm.
Biểu thức trung tâm của rename
lệnh này sẽ tìm kiếm các chuỗi trong tên tệp có chuỗi ký tự “stri” hoặc “stra” trong đó các chuỗi đó ngay sau đó là “ng”. Nói cách khác, cụm từ tìm kiếm của chúng tôi sẽ tìm kiếm “chuỗi” và “lạ”. Thuật ngữ thay thế là “bang”.
ls str*.c
rename 's/(stri|stra)ng/bang/' *.c
ls ban*.c
Sử dụng ls
lần thứ hai xác nhận rằng string.c đã trở thành bang.c và Strale.c bây giờ là bangle.c.
Sử dụng bản dịch có đổi tên
Các lệnh rename
có thể thực hiện hành động trên tên tập tin gọi là bản dịch. Một ví dụ đơn giản về bản dịch là buộc một tập hợp các tên tệp thành chữ hoa.
Trong lệnh rename
dưới đây, lưu ý rằng chúng tôi không sử dụng một s/
để bắt đầu biểu thức trung tâm, chúng tôi đang sử dụng y/
. Điều này cho biết rename
chúng tôi không thực hiện thay thế; chúng tôi đang thực hiện một bản dịch.
Các a-z
hạn là một biểu thức Perl đó có nghĩa là toàn bộ chữ thường trong chuỗi từ a đến z. Tương tự, A-Z
thuật ngữ đại diện cho tất cả các chữ cái viết hoa trong trình tự từ A đến Z.
Biểu thức trung tâm trong lệnh này có thể được diễn giải như “nếu tìm thấy bất kỳ chữ cái thường nào từ a đến z trong tên tệp, hãy thay thế chúng bằng các ký tự tương ứng từ chuỗi ký tự viết hoa từ A đến Z.”
Để buộc tên tệp của tất cả các tệp “.prg” thành chữ hoa, hãy sử dụng lệnh sau:
rename ‘y/a-z/A-Z/’ *.prg
ls * .PRG
Các ls
lệnh cho chúng ta thấy rằng tất cả các tên tập tin “.prg” bây giờ là chữ hoa. Trên thực tế, chính xác một cách nghiêm túc, chúng không phải là tệp “.prg” nữa. Chúng là các tệp “.PRG”. Linux phân biệt chữ hoa chữ thường.
Chúng ta có thể đảo ngược lệnh cuối cùng đó bằng cách đảo ngược vị trí của các số hạng a-z
và A-Z
trong biểu thức trung tâm.
rename ‘y/A-Z/a-z/’ *.PRG
ls * .prg
Bạn sẽ không học Perl trong năm phút
Để hiểu rõ Perl là thời gian dành cho bạn. Nhưng để bắt đầu sử dụng khả năng tiết kiệm thời gian của lệnh rename
, bạn không cần phải có nhiều kiến thức về Perl để gặt hái những lợi ích lớn về sức mạnh, tính đơn giản và thời gian.