Xóa các tệp cụ thể dựa trên tên tệp từ thiết bị đầu cuối


13

Tôi có một thư mục chứa các tệp có tên

rho_0.txt
rho_5000.txt
rho_10000.txt
rho_150000.txt
rho_200000.txt

và như thế. Tôi muốn xóa tất cả những cái đó là bội số của 5000.

Tôi đã thử như sau : printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | rm, nhưng điều đó đã cho tôi phản hồi rm: missing operand.

Có một cách khác để làm điều này?


6
Bất kể bạn làm điều này như thế nào, tôi khuyên bạn (để an toàn) di chuyển các tệp mong muốn vào một thư mục, sau đó khi bạn xác nhận rằng tất cả và chỉ các tệp sẽ bị xóa trong thư mục, hãy xóa thư mục.
dùng117529

An toàn là quan trọng ở đây. Tôi thường kiểm tra những điều này với lsđầu tiên.
Scot

Câu trả lời:


49

Bạn không cần một vòng lặp hoặc các lệnh bổ sung mà bạn có Bash Shell Brace Expansion.

rm -f rho_{0..200000..5000}.txt

Giải thích : {start..end..step}. Các -flờ nhắc trên các tập tin không tồn tại.


Ps Để giữ an toàn và kiểm tra những tập tin nào sẽ bị xóa, trước tiên hãy làm một bài kiểm tra với:

ls -1 rho_{0..200000..5000}.txt

13

rmkhông đọc từ đầu vào tiêu chuẩn. Bạn có thể làm:

for i in $(seq 5000 5000 25000); do
    rm -i rho_${i}.txt
done

Tôi bao gồm -itùy chọn rmnhắc nhở trước khi xóa để bạn có thể xác minh hành vi. Khi bạn tự tin rằng nó đang làm những gì bạn muốn, bạn có thể bỏ qua tùy chọn đó.

Chỉnh sửa: Ngoài ra, bạn có thể làm:

for ((i = 5000; i <= 25000; i += 5000)); do
    rm -i rho_${i}.txt
done

Hình thức đó có thể quen thuộc hơn nếu bạn đã thực hiện bất kỳ chương trình nào.


12

Bạn không thể chuyển sang chương trình như thể nội dung của ống là đối số. Nó được gửi qua stdin.

Bạn nên sử dụng xarg cho mục đích này:

printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs rm 

nhưng trước tiên bạn có thể thử với tiếng vang để xem mọi thứ có đúng như bạn dự định không:

printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs echo

Nếu phiên bản của seq-f/ --formattùy chọn mà bạn có thể sử dụng thay vì điều này làm việc xung quanh với printfvà thay thế lệnh.
David Foerster

Cảm ơn, tôi vừa trả lời bằng cách sử dụng lệnh được sử dụng trong câu hỏi và cố gắng giải thích lỗi rm của anh ấy
M4rty

9

Ai đó sửa tôi nếu tôi sai, nhưng nếu tất cả các tệp bắt đầu bằng rho_hình thức này, thì nó không tương đương để làm

rm rho_0.txt rho_*[05]000.txt

Vì một số (khác 0) là bội số của 5000 khi và chỉ khi nó kết thúc vào 0000 hoặc 5000.

(0 là trường hợp đặc biệt, vì nó là bội số của 5000, nhưng thường được viết mà không có các số 0 đứng đầu. Nếu bạn không có ý định bao gồm 0, thì hãy đưa nó ra khỏi dòng trên.)

Tất nhiên điều này chỉ nên được sử dụng nếu tất cả các rho_*.txttệp trong thư mục của bạn có dạng mong muốn. Đừng sử dụng nó nếu thư mục của bạn cũng chứa rho_please_dont_delete_me_5000.txt.

(Ghi chú toán học: Điều này hoạt động chính xác bởi vì tất cả các yếu tố chính của 5000, cụ thể là 2 và 5, cũng là các yếu tố chính của cơ sở chúng ta đang làm việc, 10. Tương đương, có một công suất đủ lớn là 10 (cụ thể là 10000) chia hết cho 5000. Không có mẹo tương tự để khớp tất cả những số bội số của 3000.)


Đây thực sự là câu trả lời tốt nhất.
Caesarv
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.