Một trong những tác vụ phổ biến nhất mà người dùng Linux thường gặp phải là đổi tên file hàng loạt. Đối với những ai chưa quen với giao diện dòng lệnh (shell) của Linux, đây có vẻ là một công việc thủ công và tốn thời gian. Tuy nhiên, có rất nhiều cách để tự động hóa và tăng tốc quá trình này, bạn chỉ cần biết phương pháp nào là tối ưu nhất cho nhu cầu của mình.
Các Tình Huống Đổi Tên File Phổ Biến
Để minh họa từng phương pháp, chúng ta sẽ sử dụng hai ví dụ đại diện cho các tác vụ đổi tên phổ biến mà bạn có thể muốn thực hiện. Có nhiều cách khác nhau để đổi tên file tùy thuộc vào tên hiện tại và mục đích của bạn. Hai ví dụ này sẽ giúp minh họa cách sử dụng điển hình của từng công cụ. Tuy nhiên, bạn cần nghiên cứu sâu hơn công cụ mình chọn để hiểu cách sử dụng tốt nhất cho nhu cầu cụ thể của mình.
Việc xác định chính xác những gì bạn muốn làm có lẽ là phần khó nhất của việc đổi tên file hàng loạt. Hãy cân nhắc những phần nào trong tên file bạn muốn xóa, giữ lại hoặc chuyển đổi thành một cái gì đó khác.
Tác vụ đầu tiên là thay đổi phần mở rộng (đuôi file) của tất cả các file phù hợp trong thư mục hiện tại. Ví dụ, đổi đuôi “.txt” thành “.md” sẽ đổi tên test-001.txt
thành test-001.md
, và đổi tên ANOTHER.txt
thành ANOTHER.md
. Nó chỉ áp dụng cho các file có đuôi “.txt” và không phải các file khác.
Tác vụ thứ hai phức tạp hơn một chút, nhằm thể hiện một số tính năng nâng cao của các công cụ này. Nó sẽ loại bỏ một phần cụ thể của tên file, giữ nguyên mọi thứ khác. Tác vụ này sẽ áp dụng cho tất cả các file, bao gồm cả các thư mục con (đệ quy). Cụ thể, chúng ta sẽ tìm tất cả các file có dạng DDDD_something.ext
và đổi tên chúng thành DDDD.ext
. Ví dụ: 1234_this-is-my-doc.doc
sẽ thành 1234.doc
và docs/9999_about.txt
sẽ thành docs/9999.txt
.
Các Phương Pháp Đổi Tên File Hàng Loạt Trong Linux
1. Sử Dụng Vòng Lặp for
, Globbing và Thay Thế Tham Số (Parameter Substitution
)
Phương pháp đầu tiên này sử dụng một số tính năng của shell Bash, mà nhiều shell khác cũng đã vay mượn. Đầu tiên là vòng lặp for
đơn giản, được sử dụng để lặp qua một tập hợp các file ứng cử viên. Thứ hai, nó xác định các file đó bằng cách sử dụng glob, một loại mẫu được tối ưu hóa cho việc khớp tên file. Cuối cùng, phương pháp này sử dụng cú pháp cho phép bạn sửa đổi chuỗi dựa trên các mẫu nhất định, được gọi là thay thế tham số.
Đối với tác vụ đầu tiên, bạn có thể thay đổi đuôi .txt
thành .md
bằng đoạn mã shell sau:
for file in ./*.txt;do mv -- "$file" "${file%.txt}.md";done
Vòng lặp for
lặp qua tất cả các file khớp với glob ./*.txt
. Điều này sẽ khớp với tất cả các file trong thư mục hiện tại kết thúc bằng đuôi “.txt”.
Lệnh mv
bên trong vòng lặp di chuyển file đến một tên mới, được tạo bằng toán tử %
. Ký hiệu này loại bỏ từ một chuỗi phần ngắn nhất của một mẫu khớp với phần cuối của nó. Trong trường hợp này, nó loại bỏ “.txt” khỏi cuối mỗi tên file, sau đó thêm “.md” vào cuối.
Tất cả các ví dụ trong bài viết này chỉ mang tính minh họa và không nên được sử dụng một cách ngây thơ trong môi trường sản xuất. Để có một giải pháp mạnh mẽ, bạn nên xem xét liệu tên file của bạn có thể chứa các ký tự đặc biệt – đặc biệt là khoảng trắng – và bạn nên luôn có chính sách sao lưu để đề phòng sự cố.
Tác vụ thứ hai bắt đầu với một mẫu glob phức tạp hơn nhiều để xử lý cả đệ quy và một tập hợp file rộng hơn:
for file in ./**/[[:digit:]][[:digit:]][[:digit:]][[:digit:]]_?*.*;do mv -- "$file" "${file//_*./.}";done
Mẫu ./**/**
mở rộng để khớp với thư mục hiện tại và bất kỳ thư mục con nào, ở bất kỳ cấp độ nào bên dưới thư mục này. Mẫu [[:digit:]]
khớp với một chữ số duy nhất, vì vậy bốn chữ số liên tiếp, theo sau là dấu gạch dưới, sẽ khớp với các file yêu cầu của chúng ta.
Thumbnail bài viết so sánh cách dùng shebang #!/bin/bash và #!/bin/sh trong shell script Linux, liên quan đến cấu hình shell và globbing.
Đảm bảo bạn hiểu rõ shell mà bạn đang sử dụng để chạy lệnh này và các tính năng globbing mà nó hỗ trợ.
Để kích hoạt globbing đệ quy trong Bash 4+, hãy đảm bảo bạn chạy shopt -s globstar
, hoặc là một lệnh một lần hoặc trong script của bạn. Trên Mac, shell zsh hỗ trợ globbing đệ quy theo mặc định.
2. Kết Hợp Vòng Lặp for
và Lệnh sed
Một lựa chọn khác cho lệnh bên trong vòng lặp for
của bạn là sed
, trình chỉnh sửa luồng (stream editor). Chương trình sed
có sẵn trên hầu hết các hệ điều hành Linux, bao gồm cả macOS.
for file in ./*.txt;do mv -- "$file" "$(echo "$file" | sed -e 's/txt$/md/')";done
Sự khác biệt trong phiên bản này là việc thay thế tham số được thay thế bằng thay thế lệnh (command substitution) và một lời gọi đến sed
. Cú pháp $(...)
khiến lệnh chạy và đầu ra của nó được thay thế tại điểm này.
Biểu thức chính quy được truyền cho sed
thay thế giá trị “txt” ở cuối mỗi tên file bằng “md”. Ký tự $
trong mẫu đảm bảo việc khớp diễn ra ở cuối tên file.
Trong tác vụ thứ hai, biểu thức chính quy thậm chí còn phức tạp hơn, mặc dù cách tiếp cận cơ bản vẫn giữ nguyên:
for file in ./**/[[:digit:]][[:digit:]][[:digit:]][[:digit:]]_*.*;do mv -- "$file" "$(echo "$file" | sed -E -e 's/([[:digit:]]{4})_.+(..+)/12/')";done
Lưu ý rằng cú pháp biểu thức chính quy của sed
hỗ trợ các toán tử lặp như {4}
, cho phép bạn tránh cách tiếp cận dài dòng hơn trong mẫu glob.
Mặc dù các giải pháp sed
này dài hơn một chút so với các phương pháp thay thế tham số tương ứng, chúng có thể dễ đọc hơn, đặc biệt đối với những người có hiểu biết về biểu thức chính quy và sed
. Việc hỗ trợ biểu thức chính quy, cùng với nhiều tính năng khác, có nghĩa là sed
là một lựa chọn mạnh mẽ hơn nhiều. Đối với các yêu cầu phức tạp, điều này có thể làm cho nó trở thành một lựa chọn ưu tiên.
3. Lệnh rename
Mạnh Mẽ Với Perl Regular Expressions
Lệnh rename
là một script Perl với hỗ trợ chạy mã Perl tùy ý, được tối ưu hóa để xử lý việc đổi tên file. Điều này có nghĩa là nó rất mạnh mẽ, mặc dù bạn sẽ cần cài đặt nó trên một hệ thống có Perl.
Sau khi cài đặt, rename
rất dễ sử dụng cho các tác vụ đơn giản, chẳng hạn như đổi đuôi file trong ví dụ đầu tiên của chúng ta:
rename 's/txt$/md/' ./*.txt
Lưu ý rằng biểu thức chính quy giống hệt với biểu thức trong ví dụ sed
tương đương. Tuy nhiên, ở đây, lợi ích nằm ở cách rename
xử lý đầu vào tên file. Chương trình sẽ áp dụng sự thay thế của nó cho từng đối số tên file, vì vậy việc sử dụng glob mở rộng ra tất cả các file .txt
có nghĩa là bạn có thể hoàn thành tác vụ chỉ với một dòng lệnh.
Lệnh rename
hỗ trợ tùy chọn -n
/--dry-run
, in ra nhật ký các thay đổi tiềm năng mà không thực sự đổi tên file. Đây là một biện pháp an toàn tuyệt vời mà chúng tôi khuyên bạn nên sử dụng bất cứ khi nào có thể.
Bạn cũng chỉ cần một lệnh một dòng cho tác vụ thứ hai, ngay cả khi biểu thức chính quy phức tạp hơn một chút.
rename 's/(/d{4})_.*(..*)/$1$2/' ./**/*
Lưu ý, một lần nữa, rằng điều này tận dụng sự hỗ trợ blog mở rộng cho các thư mục đệ quy.
4. Sử Dụng zmv
Trong Z Shell (zsh)
Nếu bạn sử dụng zsh
, Z Shell, có một tùy chọn khác trong tầm tay bạn, miễn là bạn kích hoạt nó trước. zmv
là một hàm shell hoạt động giống như một phiên bản đơn giản hóa của rename
. Bạn sẽ cần tải nó – hoặc trên cơ sở từng trường hợp, hoặc thông qua một script khởi động như .zshrc
– bằng lệnh này:
autoload zmv
Sau khi được kích hoạt, bạn có thể gọi zmv
như sau để thực hiện tác vụ đầu tiên:
zmv -W '*.txt' '*.md'
Không giống như rename
, zmv
đưa chúng ta trở lại globbing thay vì biểu thức chính quy, vì vậy nó ít mạnh mẽ hơn một chút. Nhưng, như bạn có thể thấy từ ví dụ này, nó dễ sử dụng; tùy chọn -W
đơn giản hóa cú pháp thậm chí còn hơn mặc định.
Vì zmv
là một hàm shell, nó không có trang man
tích hợp. Nhưng bạn có thể tìm hiểu một số thông tin về nó qua man zshcontrib
. Đặc biệt, lưu ý rằng nó cũng hỗ trợ tùy chọn -n
để thực hiện chạy thử (dry run).
Vì zmv
yêu cầu zsh
, nó được hưởng lợi từ globbing mở rộng mà shell cung cấp, bao gồm cả việc đệ quy vào các thư mục con.
zmv '(**/)([0-9][0-9][0-9][0-9])_*(.*)' '$1$2$3'
Không có hỗ trợ biểu thức chính quy, mẫu này dài hơn một chút, nhưng vẫn rất dễ đọc.
5. Lệnh mmv
Cho Di Chuyển Nhiều File
mmv
là viết tắt của “multiple move” và là một công cụ khác được thiết kế đặc biệt để xử lý việc đổi tên file hàng loạt. Bạn có thể sẽ cần cài đặt nó, nhưng đây chỉ là một trường hợp đơn giản của sudo apt install mmv
(Ubuntu), sudo yum install mmv
(RHEL/CentOS/Fedora), brew install mmv
(Mac), hoặc lệnh tương đương trong trình quản lý gói của bạn.
Sau khi cài đặt, bạn có thể sử dụng công cụ này để đổi tên phần mở rộng một cách dễ dàng:
mmv '*.txt' '#1.md'
Sự khác biệt lớn với mmv
là cách nó xử lý các mẫu và khớp. Ngoài các ký tự đại diện quen thuộc nhất, mmv
cũng hỗ trợ ký tự đại diện ;
mà bạn có thể sử dụng để khớp với bất kỳ số lượng thư mục nào, hỗ trợ tính chất đệ quy của tác vụ thứ hai:
mmv -n ';[0-9][0-9][0-9][0-9]_*.*' '#1#2#3#4#5.#7'
Cũng lưu ý cách mmv
hỗ trợ tham chiếu đến các khớp, không phải thông qua dấu ngoặc đơn điển hình, mà bằng cách gán một số duy nhất cho mỗi ký tự đại diện riêng lẻ. Điều này mang lại cho chúng ta bảy khớp khác nhau trong biểu thức thay thế cuối cùng: một cho đường dẫn dẫn đầu được khớp bởi ;
, một cho mỗi trong bốn chữ số, một – #6
– cho bất kỳ ký tự nào sau dấu gạch dưới, mà chúng ta bỏ qua, và một cho phần mở rộng theo sau dấu chấm.
Do cách tiếp cận này, mmv
có thể quá cồng kềnh đối với các tác vụ liên quan đến quá nhiều ký tự đại diện trong mẫu ban đầu. Nhưng khi thực hiện các tác vụ như đổi đuôi file phổ biến, rất khó để vượt qua sự đơn giản và dễ đọc của nó.
Lời Khuyên Và Kết Luận
Mặc dù có nhiều lựa chọn để đổi tên file hàng loạt trong Linux, mỗi lựa chọn đều cần một chút thời gian để làm quen. Chúng tôi khuyên bạn nên chọn một công cụ có vẻ dễ tiếp cận nhất và làm quen với nó càng tốt, sử dụng rộng rãi tùy chọn -n/--dry-run
cho những công cụ hỗ trợ nó.
Nếu bạn là một người hâm mộ biểu thức chính quy, rất khó để đánh bại sức mạnh tuyệt đối của chúng, và một công cụ như rename
có lẽ sẽ phục vụ bạn tốt. Mặt khác, nếu bạn là một “phù thủy shell”, một chuyên gia về ký tự đại diện, bạn có lẽ sẽ thích zmv
hoặc mmv
. Nhưng những công cụ đó chỉ tốt nếu bạn sử dụng Z shell, hoặc nếu bạn cài đặt chúng và học cú pháp đặc trưng của chúng.
Trong khi đó, thay thế tham số có thể mạnh mẽ một cách đáng ngạc nhiên, và bạn có thể muốn lặp lại việc đổi tên file hàng loạt của mình, vì vậy việc viết một shell script còn có những lợi ích hơn nữa. Cuối cùng, sự lựa chọn là của bạn, và bất kỳ tùy chọn nào trong số này đều tốt hơn việc đổi tên thủ công hàng trăm file bằng GUI. Đó chính là sức mạnh của dòng lệnh. Hãy chia sẻ kinh nghiệm và công cụ yêu thích của bạn để đổi tên file hàng loạt trong phần bình luận bên dưới nhé!