Đổi tên một nhóm các tệp bằng một lệnh


38

Nếu tôi có một nhóm các tệp có phần mở rộng .htm, làm cách nào tôi có thể đổi tên tất cả chúng thành .html?

mv *.htm *.html

không hoạt động.


Chỉ cần hoàn thành, ren *.htm *.htmlsẽ hoạt động trong Windows.
Brian Burns

Câu trả lời:


50

Hoặc, bạn có thể sử dụng bash thuần túy ... (ngoại trừ mv, nghĩa là ..)

for file in *.htm; do mv "$file" "${file%.htm}.html"; done

và tránh những thứ cơ sở khó chịu. ;)

Bash có một loạt các tùy chọn mở rộng biến. Cái được sử dụng ở đây, '%', loại bỏ hậu tố phù hợp nhỏ nhất khỏi giá trị của biến. Các mô hình là một mô hình toàn cầu, do đó ${file%.*}cũng sẽ làm việc. Toán tử '%%' loại bỏ hậu tố phù hợp lớn nhất và có thể hoán đổi cho nhau trong ví dụ trên, vì mẫu đã được sửa, ${file%%.*}.htmlsẽ biến abhtm thành a.html.

Xem phần biến thế của trang bash để biết các thủ thuật gọn gàng hơn. Có rất nhiều thứ có thể được thực hiện trong bash trực tiếp.


1
Cũng lưu ý rằng các mở rộng tham số này không giới hạn ở bash . Chúng có sẵn trên tất cả các vỏ có nguồn gốc Bourne ( sh , ksh , bash , zsh , dash , tro , v.v.). Các bản mở rộng là một phần của đặc tả POSIX cho Ngôn ngữ lệnh của Shell Shell và có tính di động cao.
Chris Johnsen

11

Không nên có khoảng trắng, dòng mới hoặc khoảng trắng khác trong tên tệp, nhưng phiên bản trả lời của freiheit này xử lý chúng. Nó cũng sử dụng $()thay vì backticks để dễ đọc cùng với các lợi ích khác.

for file in *.htm
do
    mv "$file" "$(basename "$file" .htm).html"
done

Thậm chí tốt hơn - đối với trường hợp đặc biệt chỉ thêm vào cuối:

for file in *.htm
do
    mv "$file" "${file}l"
done

11

rename(1)là một tiện ích Perl thực hiện chính xác những gì bạn muốn. Trong trường hợp này:

rename 's/\.htm$/.html/' *htm

hoặc nếu bạn đang sử dụng thư mục con là tốt

(yêu cầu Bash 4.0 và các thiết lập globstar: shopt -s globstar)

rename 's/\.htm$/.html/' **/*htm


1
đổi tên dễ dàng hơn, nhưng không phải là một chương trình unix tiêu chuẩn; câu hỏi ban đầu không xác định unix nào. Có vẻ là "prename" ở một số nơi.
freiheit

2
renameđi kèm với perl, và về cơ bản mọi unix đều đi kèm với perl những ngày này.
TRS-80

3
có, nhưng không phải mọi unix đều bao gồm các chương trình phụ trợ như 'đổi tên' khi chúng đưa perl vào hệ thống. OSX, chẳng hạn, không có "đổi tên" trên đó.
freiheit

1
@William: Cú pháp dấu sao đôi chỉ khả dụng trong Bash 4 trở lên và chỉ khi nó được bật shopt -s globstar(tắt theo mặc định). Ngoài ra, Linux và Unix có các thư mục hơn là các thư mục.
Tạm dừng cho đến khi có thông báo mới.

6
for file in *.htm; do
  mv $file `basename "$file" .htm`.html
done

Hãy thử nó với một echoở phía trước của mvlần đầu tiên xung quanh.

Vấn đề với bản gốc của bạn là " mv *.htm *.html" có *s được xử lý bởi shell, vì vậy mvlệnh chỉ đơn giản nhìn thấy một danh sách tất cả các tệp .htm và .html trong thư mục hiện tại. Nói cách khác, một cái gì đó như " mv foo.htm bar.htm stuff.htm six.htm file.htm". mv chỉ biết cách xử lý nhiều hơn 2 đối số nếu cái cuối cùng là một thư mục.


1
Bạn nên trích dẫn "$ file", để xử lý khoảng trắng.
Richard Hoskins

Mô tả của bạn về vấn đề ban đầu nên được nhấn mạnh hơn. Hành vi mở rộng ký tự đại diện này là đáng ngạc nhiên và không trực quan đối với ai đó đến từ Windows, và hiểu những gì trình bao làm cho nó rõ ràng lý do tại sao ứng dụng gốc của mvsẽ không hoạt động.
Greg Hewgill

3

Một ví dụ bash thuần khác sử dụng chuỗi thay thế.

for file in *.htm; do mv $file ${file/htm/html}; done

Thêm - điều này thay thế tất cả các lần xuất hiện của một chuỗi

for file in *.htm; do mv $file ${file//htm/html}; done


1

Công cụ tốt nhất là mmv .

mmv \*.htm #1.html

Các ví dụ khác về việc sử dụng (và của các công cụ khác) trong " Tóm tắt các công cụ dòng lệnh GNU / Linux ".


1
Ví dụ sử dụng của bạn không thành công. Bạn cần phải trốn thoát #.
Cristian Ciupitu

Không, nó hoạt động (TÔI LUÔN kiểm tra trước khi đăng lên SuperUser). Nhu cầu thoát # phụ thuộc vào trình bao bạn sử dụng (tôi sử dụng zsh).
bortzmeyer

0

Gói tiện ích linux-ng (trên Fedora) có renamelệnh tương tự như lệnh được đề cập bởi TRS-80 . Bạn có thể sử dụng nó như thế này:

rename .htm .html *.html
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.