Làm cách nào để đổi tên tất cả các tệp thành chữ thường?


122

Tôi lấy ví dụ TREE.wav, ONE.WAV. Tôi muốn đổi tên nó thành tree.wav, one.wav. Làm cách nào để đổi tên tất cả các tệp thành chữ thường?


1
Bạn có cảm thấy thoải mái với giải pháp Terminal / shell không? Hay bạn muốn mã C / Objective-C thực hiện được điều đó?

Giải pháp đầu cuối sẽ ổn.
Voloda2

3
Tôi nghĩ điều này nên được mở lại. mã thiết bị đầu cuối cũng là mã
Danield

1
Đây phải là một câu hỏi hợp lệ trên stackoverflow. Đây cũng là mã.
adev

Câu trả lời:


370

Nếu bạn thấy thoải mái với thiết bị đầu cuối:

  1. Mở Terminal.app, nhập cdrồi kéo và thả Thư mục chứa các tệp cần đổi tên vào cửa sổ.
  2. Để xác nhận rằng bạn đang ở đúng thư mục, hãy nhập lsvà nhấn enter.
  3. Dán mã này và nhấn enter:

    for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
  4. Để xác nhận rằng tất cả các tệp của bạn đều là chữ thường, hãy nhập lsvà nhấn enter một lần nữa.

(Cảm ơn @bavarious trên twitter về một số bản sửa lỗi và cảm ơn John Whitley bên dưới vì đã làm cho điều này an toàn hơn trên các hệ thống tệp không phân biệt chữ hoa chữ thường).


9
Hãy cẩn thận. Nếu bạn có các tệp được đặt tên foo.txtFOO.TXT, điều này có thể chặn một trong số chúng.
Keith Thompson

1
Với bash, bạn chỉ có thể làm: mv "$f" "${f,,}"hoặcdeclare -l g=$f; mv "$f" "$g"
glenn jackman

2
tôi đã thử tất cả các lệnh này, tôi nhận được "mv: 'PPP.txt' và 'ppp.txt' là cùng một tệp" và nó không viết thường tệp của tôi ... bất kỳ ý tưởng nào? Có phải vì nó trong cùng một thư mục?
lorless

1
user2066039: Đây phải là một thứ mới xuất hiện trên Mac, bởi vì hầu hết các câu trả lời cũ hơn một năm không giải thích được. Tôi đã hoàn thành nhiệm vụ bằng cách sử dụng tiện ích mở rộng trung gian như 'jpg1'. Vì vậy, JPG -> jpg1 -> jpg. Hy vọng rằng sẽ giúp.
Joyce

14
Người dùng OS X nên đổi tên từng tệp thành tên tạm thời trước tiên do hệ thống tệp không phân biệt chữ hoa chữ thường, ví dụ: for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
John Whitley

10

Câu hỏi khi được hỏi là chung chung và cũng quan trọng, vì vậy tôi muốn cung cấp câu trả lời tổng quát hơn:

Trường hợp đơn giản nhất (an toàn hầu hết thời gian và trên Mac OS X, nhưng hãy đọc tiếp):

for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; mv "$i" "$j" ; done

Bạn cũng cần xử lý khoảng trắng trong tên tệp (bất kỳ hệ điều hành nào):

IFS=$'\n' ; for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; mv "$i" "$j" ; done

Bạn cần phải xử lý an toàn các tên tệp chỉ khác nhau theo từng trường hợp trong hệ thống tệp phân biệt chữ hoa chữ thường và không ghi đè lên đích (ví dụ: Linux):

for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; [ -e "$j" ] && continue ; mv "$i" "$j" ; done 

Lưu ý về Mac OS X:

Hệ thống tập tin của Mac không phân biệt chữ hoa chữ thường, bảo toàn chữ hoa chữ thường.

Tuy nhiên, không cần tạo tệp tạm thời, như được đề xuất trong câu trả lời và nhận xét được chấp nhận, bởi vì hai tên tệp chỉ khác nhau theo trường hợp không thể tồn tại ngay từ đầu, ref .

Để hiển thị điều này:

$ mkdir test
$ cd test
$ touch X x
$ ls -l 
total 0
-rw-r--r--  1 alexharvey  wheel  0 26 Sep 20:20 X
$ mv X x
$ ls -l 
total 0
-rw-r--r--  1 alexharvey  wheel  0 26 Sep 20:20 x

Có - nhưng ví dụ của bạn gợi ý rằng bạn có thể viết thường tên tệp bằng cách sử dụng 'mv X x'. Vì vậy, nó chỉ là mà tôi đã nhận xét.
cpaludan

mojave 10.14.5: # touch X x # ls -la total 0 -rw-r - r-- 1 root root 0 Jun 24 15:19 X # mv X x mv: 'X' và 'x' giống nhau tập tin # ls -LA -rw-r - r-- 1 root root 0 24 Tháng Sáu 15:19 X
cpaludan

Xin lỗi vì định dạng tồi tệ. VẬY đã không tốt với tôi ở đó.
cpaludan

1
Và điều tồi tệ của tôi - là trong một ssh trên mâm xôi của tôi trên một ổ đĩa dùng chung (được định dạng hfsplus) - nó không hoạt động. Nhưng cục bộ trên mac của tôi thì có.
cpaludan

cho tôi trong *; do j = $ (tr '[: upper:]' '[: Lower:]' <<< "$ i"); mv "$ i" "$ j"; đã làm việc cho tôi tại catalina. Cảm ơn.
Sinan Eldem

2

Một phiên bản vỏ cá:

for old in *
    set new (echo $old | tr '[A-Z]' '[a-z]')
    mv $old $new
end
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.