Đổi tên tất cả các tệp trong một thư mục có tiền tố "Unix_"
Giả sử một thư mục có hai tệp
a.txt
b.pdf
thì cả hai đều phải được đổi tên từ một lệnh duy nhất thành
Unix_a.txt
Unix_b.pdf
Đổi tên tất cả các tệp trong một thư mục có tiền tố "Unix_"
Giả sử một thư mục có hai tệp
a.txt
b.pdf
thì cả hai đều phải được đổi tên từ một lệnh duy nhất thành
Unix_a.txt
Unix_b.pdf
Câu trả lời:
Nếu tên tệp của bạn không chứa khoảng trắng và bạn không có bất kỳ thư mục con nào, bạn có thể sử dụng một for
vòng lặp đơn giản :
$ for FILENAME in *; do mv $FILENAME Unix_$FILENAME; done
Nếu không, hãy sử dụng rename
lệnh thuận tiện (là một tập lệnh perl) - mặc dù nó có thể không khả dụng trên mọi Unix (ví dụ: OS X không đi kèm rename
).
Tổng quan ngắn gọn tại debian-administration.org:
Nếu tên tệp của bạn chứa khoảng trắng thì sẽ dễ sử dụng hơn find
, trên Linux, cách sau sẽ hoạt động:
$ find . -type f -name '*' -printf "echo mv '%h/%f' '%h/Unix_%f\n'" | sh
-printf
Thật không may, trên các hệ thống BSD, không có tùy chọn nào . Nhưng các công cụ tìm GNU phải có thể cài đặt được (ví dụ như Mac OS X với brew install findutils
).
$ gfind . -type f -name '*' -printf "mv \"%h/%f\" \"%h/Unix_%f\"\n" | sh
find
.
for f in *; do [[ -f ${f} ]] && mv ...; done
để bắt chỉ file ... (không thư mục con, liên kết, vv.)
for FILENAME in *; do mv "$FILENAME" "Unix_$FILENAME"; done
hoạt động chính xác bất kể ký tự nào trong tên tệp. Nó cũng di chuyển thư mục, ổ cắm, liên kết tượng trưng và các loại tệp khác; Tôi cho rằng điều đó không quan trọng.
.
trước tất cả các tệp của tôi
Hãy thử rename
lệnh trong thư mục có các tệp :
rename 's/^/Unix_/' *
Đối số của rename ( lệnh sed s ) cho biết thay thế regex ^ bằng Unix_ . Dấu mũ (^) là một ký tự đặc biệt có nghĩa là đầu dòng .
's/^/.../'
có nghĩa là?
's/^/.../'
là lập luận biểu perl cho lệnh đổi tên
rename 's/^start_/run_' *
Tôi nghĩ đây chỉ là những gì bạn đang tìm kiếm:
ls | xargs -I {} mv {} Unix_{}
Vâng, nó đơn giản nhưng thanh lịch và mạnh mẽ, và cũng là một lớp lót. Bạn có thể nhận được phần giới thiệu chi tiết hơn từ tôi trên trang: Đổi tên tệp và thư mục (Thêm tiền tố)
ls
- nó có thể dẫn đến sự cố nếu có khoảng trắng hoặc các ký tự kỳ quặc khác trong tên tệp.
Gần đây tôi đã đối mặt với tình huống tương tự này và tìm thấy một giải pháp sẵn có dễ dàng hơn. Tôi đang chia sẻ nó ở đây để nó có thể giúp những người khác đang tìm kiếm giải pháp.
Với OS X Yosemite, Apple đã tích hợp khả năng đổi tên hàng loạt trực tiếp vào Finder. Thông tin chi tiết xem tại đây . Tôi cũng đã sao chép các bước bên dưới,
Đổi tên nhiều mục
Chọn các mục, sau đó Control khi bấm vào một trong số chúng.
Trong menu lối tắt, chọn Đổi tên mục.
Trong menu bật lên bên dưới Đổi tên Mục Thư mục, hãy chọn thay thế văn bản trong tên, thêm văn bản vào tên hoặc thay đổi định dạng tên.
Thay thế văn bản: Nhập văn bản bạn muốn xóa vào trường Tìm, sau đó nhập văn bản bạn muốn thêm vào trường “Thay thế bằng”.
Thêm văn bản: Nhập văn bản bạn muốn thêm vào trường, sau đó chọn thêm văn bản vào trước hoặc sau tên hiện tại.
Định dạng: Chọn định dạng tên cho tệp, sau đó chọn đặt chỉ mục, bộ đếm hoặc ngày trước hoặc sau tên. Nhập tên vào trường Định dạng Tùy chỉnh, sau đó nhập số bạn muốn bắt đầu.
Nhấp vào Đổi tên.
Nếu bạn có một mẫu phổ biến trong tệp của mình hơn bạn có thể sử dụng Thay thế văn bản, nếu không thì Thêm văn bản cũng sẽ thực hiện công việc.
Bạn chỉ có thể sử dụng -i
thay vì-I {}
ls | xargs -i mv {} unix_{}
Điều này cũng hoạt động hoàn hảo.
ls
- liệt kê tất cả các tệp trong thư mụcxargs
- chấp nhận tất cả các tệp từng dòng do -i
tùy chọn{}
là trình giữ chỗ cho tất cả các tệp, cần thiết nếu xargs
nhận được nhiều hơn hai đối số làm đầu vàoSử dụng awk:
ls -lrt | grep '^-' | awk '{print "mv "$9" unix_"$9""}' | sh
-i
không được dùng nữa, bây giờ chỉ là-I
Cũng hoạt động cho các mục có khoảng trắng và bỏ qua các thư mục
for f in *; do [[ -f "$f" ]] && mv "$f" "unix_$f"; done
Với rnm (bạn sẽ cần cài đặt nó):
rnm -ns 'Unix_/fn/' *
Hoặc là
rnm -rs '/^/Unix_/' *
Tái bút: Tôi là tác giả của công cụ này.
rename
không hiệu quả với tôi, nhưng rnm
có.
Tình hình:
Chúng tôi có certificate.key
certificate.crt
bên trong/user/ssl/
Chúng tôi muốn đổi tên bất cứ điều gì mà bắt đầu với certificate
tớicertificate_OLD
Chúng tôi hiện đang ở bên trong /user
Đầu tiên, bạn chạy khô với -n
:
rename -n "s/certificate/certificate_old/" ./ssl/*
Trả về:
rename(./ssl/certificate.crt, ./ssl/certificate_OLD.crt)
rename(./ssl/certificate.key, ./ssl/certificate_OLD.key)
Các tệp của bạn sẽ không thay đổi, đây chỉ là một lần chạy thử nghiệm.
Giải pháp:
Khi bạn hài lòng với kết quả của bài kiểm tra, hãy chạy nó thực sự:
rename "s/certificate/certificate_OLD/" ./ssl/*
Nó có nghĩa là gì:
`đổi tên" s / SOMETHING / SOMETING_ELSE "PATH / FILES
Tiền boa:
Nếu bạn đã ở trên con đường, hãy chạy nó như thế này:
rename "s/certificate/certificate_OLD/" *
Hoặc nếu bạn muốn thực hiện việc này trong bất kỳ thư mục con nào bắt đầu bằng ss
do:
rename -n "s/certificat/certificate_old/" ./ss*/*
Bạn cũng có thể làm:
rename -n "s/certi*/certificate_old/" ./ss*/*
Đổi tên bất kỳ thứ gì bắt đầu bằng certi
trong bất kỳ thư mục con nào bắt đầu bằng ss
.
Bầu trời là giới hạn.
Chơi xung quanh với regex và LUÔN LUÔN kiểm tra điều này TRƯỚC KHI với -n
.
HÃY XEM NGOÀI NÀY SẼ NGAY LẬP TỨC THƯ MỤC RENAME TÊN ĐÓ TRẬN. Tốt hơn cd
vào thư mục và làm điều đó ở đó. SỬ DỤNG RỦI RO RIÊNG.
find -execdir rename
Điều này đổi tên các tệp và thư mục bằng một biểu thức chính quy chỉ ảnh hưởng đến tên cơ sở.
Vì vậy, đối với một tiền tố, bạn có thể làm:
PATH=/usr/bin find . -depth -execdir rename 's/^/Unix_/' '{}' \;
hoặc chỉ ảnh hưởng đến các tệp:
PATH=/usr/bin find . -type f -execdir rename 's/^/Unix_/' '{}' \;
-execdir
cd
s đầu tiên vào thư mục trước khi thực thi chỉ trên tên cơ sở.
Tôi đã giải thích chi tiết hơn tại: Tìm nhiều tệp và đổi tên chúng trong Linux