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. rename
không có sẵn và nhiều biến thể của find
lỗ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 ./FOO
theo sau ./FOO/BAR
, đổi tên ./FOO
thành ./foo
vẫn sẽ tiếp tục liệt kê ./FOO/BAR
mặ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/bar
trước ./foo
), nhưng chỉ cho các tệp có chứa ký tự in hoa. Bộ -name
lọ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/BAR
như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 ./FOO
mặc dù, nhưng cái đó được liệt kê sau này (đây là lý do tại sao -depth
quan 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 find
và định dạng chúng trong một mv
lệnh bằng cách sử dụng một biểu thức thông thường. Các -n
tùy chọn dừng sed
từ in đầu vào, và các p
lệ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 -n
tùy chọn mv
làm cho chắc chắn hiện file chữ thường không được ghi đè. Các -v
tù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 -T
nà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/BAR
nó không được chuyển vào ./FOO/bar
nế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 mv
lệnh được tạo đến trình thông dịch shell. Bạn có thể thay thế nó bằng bash
hoặc bất kỳ vỏ theo ý thích của bạn.
ABCdef
,abcDEF
và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