Câu trả lời:
Một lớp lót đơn giản nên làm (giả sử sh
vỏ tương thích Posix ):
for f in *:*; do mv -v "$f" $(echo "$f" | tr ':' '-'); done
Giải trình:
for ... in ...; do ...; done
là một vòng lặp
*:*
phù hợp với tất cả các tệp và thư mục trong thư mục hiện tại có :
tên của chúng
f
được gán lần lượt cho từng tên tệp như vậy trong vòng lặp
mv
đổi tên đối số thứ nhất thành đối số thứ hai; -v
(verbose) yêu cầu nó in những gì nó làm; tùy chọn này là GNU-utils cụ thể, vì vậy nó có sẵn trên Linux nhưng không có Solaris
echo
in đối số của nó lên đầu ra tiêu chuẩn
tr
đọc đầu ra tiêu chuẩn và dịch các ký tự theo bản đồ được cung cấp
Nếu bạn đang sử dụng bash , bạn có thể tránh sinh ra một shell ( $()
) bằng các quy trình con ( tr
) bằng cách thay thế $(...)
bằng ${f//:/-}
.
$(echo "$f" | tr ':' '-')
bằng "${f//:/-}"
và tránh cuộc gọi phụ, đường ống và chương trình bên ngoài. Tôi nghĩ rằng đây là một bashism, nhưng eh. Xem tại đây .
Như đã nêu trong một bài viết khác của tôi, rename
công cụ có thể thực hiện thủ thuật cho bạn. Bạn chỉ cần gõ
rename s/:/-/ <files to rename>
Điều này thay thế mỗi dấu hai chấm bằng dấu gạch ngang trong tất cả các tệp bạn đặt tên ở cuối, nghĩa là2013-10-*
Đây là liên kết đến bài viết khác của tôi
Tôi chắc chắn một UNIX pro có thể làm điều này với bash, nhưng đây là phiên bản nhanh và bẩn của tôi với ruby.
path_to_files = "/home/username/wrongnames/"
filenames = `ls #{path_to_files}`.split
filenames.each do |fn|
`mv #{path_to_files + fn} #{path_to_files + fn.gsub(/:/, "-")}`
end
đặt path_to_files thành đường dẫn đến các tệp được đặt tên sai của bạn. lưu mã trên vào một tệp có tên là rename.rb rồi:
username@machinename$ ruby rename.rb
Nếu bạn chỉ có một hoặc một vài tệp, điều này có thể thực hiện việc đổi tên cho bạn:
p="201*"
.old_name=$(ls | grep $p)
.Lưu trữ tên tệp mới với các ký tự thay thế cần thiết:
new_name=$(ls | grep $p | sed 's/:/_/g') # Using 'sed'
OR
new_name=$(ls | grep $p | tr ':' '_') # Using 'tr'
Tiền thưởng dọn dẹp :
a. Nếu vì sự đồng nhất, bạn muốn thay thế dấu gạch ngang (-
) cùng với dấu hai chấm (:
) bằng dấu gạch dưới (_
), bạn có thể làm điều này:
new_name=$(ls | grep $p | tr ':-' '_');
b. Nếu bạn cũng muốn dấu gạch dưới cuối cùng (ngay trước khi .txt
), hãy đặt new_name
biến là:
new_name=$(ls | grep $p | tr ':-' '_' | sed 's/_\./\./')
mv $old_name $new_name
NB: mv
sẽ thất bại nếu bất kỳ tên tệp nào trong thao tác đổi tên có spaces
trong đó. Trong trường hợp đó, bọc các biến thích hợp trong dấu ngoặc kép, như: mv "$old_name" $new_name
HOẶC mv $old_name "$new_name"
HOẶC mv "$old_name" "$new_name"
1a: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | sed 's/:/_/g'); mv $old_name $new_name
1b: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':' '_'); mv $old_name $new_name
2: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':-' '_'); mv $old_name $new_name
3: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':-' '_' | sed 's/_\./\./'); mv $old_name $new_name
Điều này có thể là quá mức cần thiết nhưng bạn có thể đổi tên bất kỳ ký tự đặc biệt nào với tập lệnh tại liên kết được cung cấp trong câu trả lời này:
for f in
vòng lặp ... là một vòng lặp lặp lại trên tất cả các tệp trong thư mục hiện tại nơi các tệp cần khớp*:*
. (Điều gì xảy ra với dirs phù hợp?). Lệnh di chuyển là một tên mới di chuyển oldname trong đó tên mới được tạo bằng cách thực hiện một shell với$( subshell here )
. Những gì tr làm, ...