Đổi tên tất cả các tệp trong một thư mục bằng tiền tố trong một lệnh duy nhất


Câu trả lời:


106

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 forvòng lặp đơn giản :

$ for FILENAME in *; do mv $FILENAME Unix_$FILENAME; done 

Nếu không, hãy sử dụng renamelệ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

-printfThậ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

@Matteo: Cảm ơn gợi ý: đã cập nhật câu trả lời của tôi với một cảnh báo cộng với hai ví dụ với find.
miku

Cũng muốn giới thiệu for f in *; do [[ -f ${f} ]] && mv ...; doneđể bắt chỉ file ... (không thư mục con, liên kết, vv.)
twalberg

1
Nếu bạn trích dẫn các biến như bạn nên làm, thì nó sẽ for FILENAME in *; do mv "$FILENAME" "Unix_$FILENAME"; donehoạ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.
Jonathan Leffler

Bằng cách nào đó, điều này đã thêm một .trước tất cả các tệp của tôi
nullability

75

Hãy thử renamelệ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 .


8
Bạn có thể giải thích những gì 's/^/.../'có nghĩa là?
mcont

@Matteo 's/^/.../'là lập luận biểu perl cho lệnh đổi tên
RoyalleBlue

điều này thật tuyệt! tôi muốn đề nghị để thêm thư mục / *, vì * là một chút nguy hiểm nếu lệnh vô tình sẽ được lặp lại ở một nơi khác
Hệ thống Rebooter

brew install rename @OliverPearmain
Felipe Plazas

Ví dụ để thay thế một tiền tố:rename 's/^start_/run_' *
Denis Alexeyevich Kolodin

33

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ố)


2
Hãy cẩn thận với việc xử lý đầu ra của 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.
Jonathan Leffler

15

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

  1. Chọn các mục, sau đó Control khi bấm vào một trong số chúng.

  2. Trong menu lối tắt, chọn Đổi tên mục.

  3. 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.

  4. 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.


Tuyệt vời - đã tiết kiệm cho tôi rất nhiều thời gian!
user3000868

6

Bạn chỉ có thể sử dụng -ithay 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ục
  • xargs- chấp nhận tất cả các tệp từng dòng do -itùy chọn
  • {}là trình giữ chỗ cho tất cả các tệp, cần thiết nếu xargsnhận được nhiều hơn hai đối số làm đầu vào

Sử dụng awk:

ls -lrt | grep '^-' | awk '{print "mv "$9" unix_"$9""}' | sh

-ikhông được dùng nữa, bây giờ chỉ là-I
JamPow

nó đã giúp tôi trên Debian 8.Thaks
Abror Esonaliyev

2

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

1

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.


2
Bạn nên xem qua tất cả các câu trả lời về tiện ích của mình và thêm tuyên bố từ chối trách nhiệm rằng bạn là tác giả của nó.
Mogsdad

@Mogsdad: Tôi không nghĩ đó là thông tin cần thiết. Nếu ai đó muốn tìm tác giả, nó khá dễ dàng.
Jahid

Cảm ơn bạn cho công cụ này. Vì một số lý do, renamekhông hiệu quả với tôi, nhưng rnmcó.
Aloso

0

Tình hình:

Chúng tôi có certificate.key certificate.crtbê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 certificatetớ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 ssdo:

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 certitrong 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 cdvào thư mục và làm điều đó ở đó. SỬ DỤNG RỦI RO RIÊNG.


0

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_/' '{}' \;

-execdircds đầ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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.