find . -depth -name '*[A-Z]*'|sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'|sh
Tôi đã không thử các tập lệnh phức tạp hơn được đề cập ở đây, nhưng không có phiên bản dòng lệnh nào hoạt động cho tôi trên NAS Synology của tôi. renamekhông có sẵn và nhiều biến thể của findlỗi vì dường như dính vào tên cũ của đường dẫn đã được đổi tên (ví dụ: nếu tìm thấy ./FOOtheo sau ./FOO/BAR, đổi tên ./FOOthành ./foovẫn sẽ tiếp tục liệt kê ./FOO/BARmặc dù đường dẫn đó không còn hợp lệ) . Lệnh trên làm việc cho tôi mà không có bất kỳ vấn đề.
Điều gì sau đây là một lời giải thích của từng phần của lệnh:
find . -depth -name '*[A-Z]*'
Điều này sẽ tìm thấy bất kỳ tệp nào từ thư mục hiện tại (thay đổi .thành bất kỳ thư mục nào bạn muốn xử lý), bằng cách sử dụng tìm kiếm theo chiều sâu (ví dụ: nó sẽ liệt kê ./foo/bartrước ./foo), nhưng chỉ cho các tệp có chứa ký tự in hoa. Bộ -namelọc chỉ áp dụng cho tên tệp cơ sở, không phải đường dẫn đầy đủ. Vì vậy, điều này sẽ liệt kê ./FOO/BARnhưng không ./FOO/bar. Điều này là ổn, vì chúng tôi không muốn đổi tên ./FOO/bar. Chúng tôi muốn đổi tên ./FOOmặc dù, nhưng cái đó được liệt kê sau này (đây là lý do tại sao -depthquan trọng).
Bản thân comand này đặc biệt hữu ích để tìm các tệp mà bạn muốn đổi tên ở vị trí đầu tiên. Sử dụng lệnh này sau khi đổi tên hoàn chỉnh để tìm kiếm các tệp vẫn chưa được thay thế do va chạm hoặc lỗi tên tệp.
sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'
Phần này đọc các tệp được xuất ra bởi findvà định dạng chúng trong một mvlệnh bằng cách sử dụng một biểu thức thông thường. Các -ntùy chọn dừng sedtừ in đầu vào, và các plệnh trong việc tìm kiếm và thay thế đầu ra regex văn bản thay thế.
Bản thân regex bao gồm hai hình chụp: phần cho đến phần cuối cùng ((là thư mục của tệp) và chính tên tệp. Thư mục được giữ nguyên, nhưng tên tệp được chuyển thành chữ thường. Vì vậy, nếu findđầu ra ./FOO/BAR, nó sẽ trở thành mv -n -v -T ./FOO/BAR ./FOO/bar. Các -ntùy chọn mvlàm cho chắc chắn hiện file chữ thường không được ghi đè. Các -vtùy chọn làm cho mvđầu ra mọi thay đổi mà nó làm (hoặc không làm - nếu ./FOO/barđã tồn tại, nó sẽ tạo ra một cái gì đó giống như ./FOO/BAR -> ./FOO/BAR, lưu ý rằng không có sự thay đổi đã được thực hiện). Điều -Tnày rất quan trọng ở đây - nó xử lý tệp đích như một thư mục. Điều này sẽ đảm bảo rằng ./FOO/BARnó không được chuyển vào ./FOO/barnếu thư mục đó tồn tại.
Sử dụng điều này cùng với findđể tạo một danh sách các lệnh sẽ được thực thi (tiện dụng để xác minh những gì sẽ được thực hiện mà không thực sự làm điều đó)
sh
Điều này khá tự giải thích. Nó định tuyến tất cả các mvlệnh được tạo đến trình thông dịch shell. Bạn có thể thay thế nó bằng bashhoặc bất kỳ vỏ theo ý thích của bạn.
ABCdef,abcDEFvàaBcDeF? Nên đổi tên kịch bản hủy bỏ hoặc chỉ cảnh báo và tiếp tục? 2. Làm thế nào để bạn xác định chữ thường cho tên không phải US-ASCII? Nếu những cái tên đó có thể xuất hiện, thì nên kiểm tra và loại trừ pass trước? 3. Nếu bạn đang chạy một hoạt động đổi tên