Sao chép một loạt các tệp trong dòng lệnh (ZSH / BASH)


13

Tôi có một danh sách các tập tin với các số liên tiếp là hậu tố. Tôi chỉ muốn sao chép một loạt các tệp này. Làm thế nào tôi có thể chỉ định một phạm vi như là một phần của lệnh cp của tôi.

$ls
P1080272.JPG* P1080273.JPG* P1080274.JPG* P1080275.JPG* P1080276.JPG* P1080277.JPG*
P1080278.JPG* P1080279.JPG* P1080280.JPG* P1080281.JPG* P1080282.JPG* P1080283.JPG*

Tôi muốn sao chép các tập tin từ P1080275.JPG sang P1080283.JPG với một cái gì đó tương tự:

$cp P10802[75-83].JPG ~/Images/.

Có cách nào để làm việc này không?

Câu trả lời:


25

Bạn đã rất thân thiết. Câu hỏi của bạn gần như đúng cú pháp:

cp P10802{75..83}.JPG ~/Images

9

Để lặp lại một phạm vi trong bash:

for x in {0..10}; do echo $x; done

Áp dụng tương tự trong trường hợp của bạn:

for x in {272..283}; do cp P1080$x.JPG ~/Images; done

Điều này không hoạt động, nhưng tôi thích câu trả lời của @glenn jackman hơn vì nó không gọi bất kỳ cấu trúc lập trình nào.
Amjith

4

Zsh, với tùy chọn Extendedglob có toán tử globalbing (khớp mẫu).

setopt extendedglob
echo P10802<75-83>.JPG

sẽ khớp tên tệp trong thư mục hiện tại khớp với mẫu đó (coi chừng P1080275.JPG khớp với nhưng P108020000000075.JPG cũng vậy)

Mặt khác, toán tử mở rộng chuỗi {x ... y} (được hỗ trợ bởi zsh và các phiên bản gần đây của bash và ksh93), mở rộng thành các chuỗi từ x đến y, bất kể tệp nào có trong thư mục hiện tại.

cp P10802<75-83>.JPG ~there

sẽ sao chép các tập tin phù hợp, vì vậy sẽ

cp P10802{75..83}.JPG ~there

Nhưng bạn sẽ gặp lỗi nếu ví dụ P1080281.JPG không tồn tại.


1

Liệu nó có giúp hiệu quả với anh không:

for each in {75..83}; do cp P10802$each.JPG ~/Images/; done
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.