Batch đổi tên tập tin thành chữ thường


17

Có cách nào để đổi tên tất cả các tệp trong một thư mục thành chữ thường | chữ hoa không?

Tôi đang tìm kiếm một lệnh oneliner .

Tôi yêu TotalCommander alt+f7, bây giờ tôi cần chức năng đó trong Terminal

Câu trả lời:


20

Đối với mỗi tệp a_filetrong thư mục hiện tại đổi tên a_filethành chữ thường.

for a_file in *;do mv -v "$a_file" `echo "$a_file" | tr [:upper:] [:lower:]` ;done;

Đối với chữ hoa, đảo ngược các đối số thành [:lower:] [:upper:]

trliên kết tham chiếu lệnh

Cập nhật

Để kiểm soát nhiều hơn *có thể được thay thế bằng ls.

Ví dụ: trong thư mục chứa 1.txt, 2.txt, 3.txt, 1.jpg, 2.jpg và 3.jpg để chỉ lọc các tệp * .jpg, lscó thể được sử dụng:

for a_file in $(ls *.jpg);do mv -v $a_file `echo $a_file | tr [:upper:] [:lower:]` ;done;

Đoạn mã trên sẽ gán cho a_filebiến tất cả các tệp có phần mở rộng .jpg.

Cập nhật-v tùy chọn thêm vào mvlệnh theo sds đề xuất.


4
bạn có thể muốn chuyển "-v" để mvbạn thấy những gì đang được thực hiện; bạn có thể không muốn vượt qua "-f" vì điều này có thể ghi đè các tệp hiện có
sds

Điều này không làm việc cho các tập tin với không gian trong tên của họ.
Tianxiang Xiong

Bạn có thể sử dụng dấu ngoặc kép xung quanh tên tệp.
Stef K

2
Xin lỗi, nhưng phần về ls * jpg là một ý tưởng tồi . mywiki.wooledge.org/ParsingLs Bạn có thể đạt được kết quả tương tự với * jpg cùng với nơi bạn có * ở vị trí đầu tiên.
tink

16

Có một tiện ích thanh lịch và chung hơn được gọi là prename.

Được viết bởi Larry Wall, nó đi kèm perlvì vậy rất có thể nó đã có sẵn trên hệ thống của bạn vì /usr/bin/prename(nếu bạn có các lựa chọn thay thế cũng có thể có sẵn dưới dạng /usr/bin/renamesymlink được liên kết qua / etc / thay thế cho prename)

Sử dụng nó, bạn có thể đổi tên nhiều tệp trong một lệnh bằng cách cung cấp bất kỳ biểu thức perl nào (bao gồm nhưng không giới hạn ở việc thay thế s///hoặc chuyển ngữ char tr///):

Ví dụ:

# Lowercase all *.JPG filenames:
prename tr/A-Z/a-z/ *.JPG

# Change any 'No' in a filename to a 'Yes':
prename s/No/Yes/g *No*

# increment first sequence of digits in a filename by 3:
prename 's/([0-9]+)/$1+3/e' *[0-9]*

# If a file contains 'aaa', append '.bak' to its name
prename 'if (/aaa/) {$_ .= ".bak"}'  *

Và như thế.

Một điều thú vị khác về prename là nó bảo vệ bạn, trong trường hợp đổi tên một tệp thành tên tệp hiện có.

man prename để biết thêm chi tiết.


1

Sử dụng find

find . -name * -type f -exec rename 'y/A-Z/a-z/' '{}' \;

Dành cho find

  • Tất nhiên sau khi -nameđặt mô hình của bạn.
  • -maxdepth 0: Chỉ thư mục hiện tại.

Dành cho rename

  • -n, -nono: Không có hành động: in tên của các tệp sẽ được đổi tên, nhưng không đổi tên.
  • y/source/dest/: Chuyển ngữ các ký tự trong không gian mẫu xuất hiện trong nguồn thành ký tự tương ứng trong mệnh.
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.