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ó 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:
Đối với mỗi tệp a_file
trong thư mục hiện tại đổi tên a_file
thà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:]
tr
liê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, ls
có 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_file
biế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 mv
lệnh theo sds đề xuất.
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 perl
vì 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/rename
symlink đượ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.
find
find . -name * -type f -exec rename 'y/A-Z/a-z/' '{}' \;
find
-name
đặt mô hình của bạn.-maxdepth 0
: Chỉ thư mục hiện tại.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.
mv
bạ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ó