Cách 'rm' hoặc 'mv' một loạt các tệp như file01.txt, file02.txt Tệp file85.txt


23

Giả sử tôi có một loạt các tệp có tên theo cách này:

file01.txt file02.txt file03.txt ... file20.txt

và tôi muốn thực thi một lệnh trên một loạt các tệp này.

Tôi biết nếu muốn 'rm' từ 'file05.txt' thành 'file09.txt' tôi có thể làm:

rm file0[5-9].txt

nhưng làm cách nào tôi có thể 'rm' một phạm vi từ file08.txt đến file13.txt? Tôi đã thử mã này

rm file[08-13].txt

và nó không hoạt động. Tôi có thể chạy lệnh này:

rm file0[89].txt file1[0-3].txt

nhưng tôi muốn biết liệu tôi có thể làm điều này chỉ với một đối số được tinh chỉnh hơn để 'rm' nếu có thể.


Một câu hỏi gần như giống hệt nhau đã được trả lời ở đây: stackoverflow.com/questions/25049411/ cấp
arielf

Câu trả lời:


38

Bạn cần sử dụng mở rộng cú đúp của bash:

rm file{08..13}.txt

Điều này sẽ loại bỏ các tập tin file08để file13, sẽ hiển thị một thông báo lỗi nếu bất kỳ tập tin là mất tích.

Đặt phạm vi để đáp ứng nhu cầu của bạn.


Vấn đề với toán tử toàn cầu []là nó xử lý từng ký tự / chữ số bên trong nó như một mã thông báo duy nhất và do đó chỉ hỗ trợ khai báo phạm vi bằng các chữ số đơn.

Nếu bạn khăng khăng sử dụng [], bạn có thể sử dụng mẫu khá xấu xí này để phù hợp file08với file13:

rm file0[8-9].txt file1[0-3].txt

5
mở rộng cú đúp cũng hữu ích với dấu phẩy, như cho mv foo.{txt,md}hoặccp foo.txt{,.bak}
Kos

2

Một số hệ vỏ, chẳng hạn như mặc định của Ubuntu /bin/sh(không có dash) hoặc mkshkhông có mở rộng dấu ngoặc hoặc trong trường hợp ksh- mở rộng dấu ngoặc không thể sử dụng các số 0 được đệm:

$ ksh -c 'echo {05..13}'
5 6 7 8 9 10 11 12 13

Trong các trường hợp như vậy, chúng ta có thể sử dụng printfđể định dạng phần số của tên tệp và sử dụng vòng lặp while để thực hiện hành vi vòng lặp giống như c (lưu ý để thay thế echobằng rmhoặc bất cứ điều gì bạn muốn):

$ i=5; while [ "$i" -le 10 ]; do num=$(printf "%.2d" "$i" ); echo "file$num.txt";i=$(($i+1)); done
file05.txt
file06.txt
file07.txt
file08.txt
file09.txt
file10.txt

Và đây là khá cầm tay - làm việc với dash, ksh, mksh, cũng bash. Trong trường hợp kshbashchúng ta cũng có thể sử dụng c-style for loop syntax (but not in case ofmksh ordash`):

$ ksh -c 'for((i=5;i<11;i++)); do num=$(printf "%.2d" "$i" ); echo "file$num.txt";done'             
file05.txt
file06.txt
file07.txt
file08.txt
file09.txt
file10.txt

Lưu ý rằng trong bashtrường hợp, printfhỗ trợ in thành biến, và do đó chúng ta có thể làm printf -v num "%.2d" "$i"thay vì sử dụng thay thế lệnh.

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.