it-swarm-vi.tech

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

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ả thành .html?

mv *.htm *.html

không hoạt động.

38
Richard Hoskins

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. Mẫu này là mẫu toàn cục, vì vậy ${file%.*} cũng sẽ hoạt động. 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%%.*}.html sẽ biến a.b.htm 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.

50
falstro

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ài đặt sao: shopt -s globstar)

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

11
TRS-80

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 này của freiheit 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
Dennis Williamson
for file in *.htm; do
  mv $file `basename "$file" .htm`.html
done

Hãy thử nó với một echo trước mv lần đầu tiên.

Vấn đề với bản gốc của bạn là "mv *.htm *.html" có *s được Shell xử lý, vì vậy lệnh mv chỉ đơn giản nhìn thấy 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.

6
freiheit

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
3
xalupadas

Nếu bạn sử dụng Zsh bạn có thể sử dụng 'zmv'

1
Martin

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ông cụ dòng lệnh GNU/Linux ".

1
bortzmeyer

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

rename .htm .html *.html
0
Cristian Ciupitu