Xóa các tệp cụ thể trong dòng lệnh


8

Tôi có tệp fileName_1 , fileName_2 ... fileName_100000 trong đó tệpNames được đánh số liên tục. Làm thế nào tôi có thể xóa các tập tin của chỉ mục lớn hơn, nói 100 ?

Câu trả lời:


17

Nếu tên tệp được đánh số liên tục, chỉ cần chạy lệnh sau:

rm fileName_{100..100000}

3
Thông tin: Điều này hoạt động vì bash (shell của bạn) sẽ mở rộng {x..y}ra toàn bộ danh sách. Ví dụ, nếu bạn sử dụng echo test{1..3}nó sẽ được mở rộng echo test1 test2 test3và sau đó thực thi. Như bạn có thể thấy, nó in test1 test2 test3. Tương tự, nếu {x..y}không được kết nối với bất kỳ đối số, nó sẽ chỉ đặt các số ở đó. Vd echo test {1..3}sẽ chỉ in test 1 2 3.
Lục

1
Lưu ý: có một giới hạn được áp đặt bởi lệnh execgọi đến số lượng đối số mà một quy trình có thể có. Bạn có thể lấy nó với getconf ARG_MAX. Ví dụ trên hệ thống của tôi, nó là 2097152(~ 2,1 triệu). Điều này có nghĩa là rm(không phải là tích hợp) sẽ thất bại với nhiều tệp hơn. Các lệnh tích hợp không có vấn đề này và các giải pháp khác cũng không được đề xuất.
Bakuriu

Lưu ý rằng ARG_MAX là một số byte, không phải là một số đối số. rm không thể xử lý xóa 2097152 tệp cùng một lúc. Nó có thể xóa 2048 tệp mà mỗi tệp có tên dài 1023 byte (không phải 1024; dấu phân cách giữa các đối số (\ 0 trong vùng đất C) được tính theo giới hạn).
trời ơi

6

Bạn cũng có thể thử lệnh này,

for i in $(seq 100 100000); do rm fileName_$i; done

Nó sẽ xóa tất cả các tệp (trong phạm vi từ 100 đến 100000) nếu tên tệp chứa các số theo thứ tự liên tiếp.


5

Nói chung, bạn có một số cách để đạt được điều này:

rm fileName_{100..100000}

sẽ được mở rộng bằng vỏ thành khoảng 100.000 tên tệp. Nếu tên cơ sở là một đường dẫn dài và số lượng đủ cao, bạn thực sự có thể vượt quá độ dài tối đa của một dòng lệnh với phương pháp này.

các forvòng lặp

for i in $(seq 100 100000); do rm fileName_$i; done

không gặp phải vấn đề này, nhưng là một cách tương đối chậm để xóa các tệp, vì trình bao phải thực hiện thay thế biến và khởi chạy rm khoảng 100.000 lần.

Cả hai phương pháp trên có thể gây ra cảnh báo nếu một số tệp filename_101bị thiếu.

Thông thường, các giải pháp dựa trên findlà tốt hơn, vì chúng chỉ hoạt động trên các tệp thực sự ở đó (trong quá trình khám phá). Tuy nhiên, có một số khác biệt tinh tế:

find . -name 'fileName_[100-100000]' -exec rm {} \;

vẫn sẽ khởi chạy rmchương trình khoảng 100.000 lần, trong khi thay thế trận chung kết \;bằng cách +cố gắng giảm thiểu số lượng quy trình con. Cả hai phương thức có thể sẽ chậm hơn (nhiều hoặc một chút) so với sử dụng -deletemà không sử dụng các lệnh bên ngoài mà chỉ gọi các cuộc gọi hệ thống thay thế.

Tuy nhiên, luôn luôn kiểm tra trước nếu mẫu thực sự khớp với các tệp bạn muốn nhắm mục tiêu:

stefan@tuxedo ~ % mkdir askubuntu
stefan@tuxedo ~ % touch askubuntu/filename_{1..1000}
stefan@tuxedo ~ % find askubuntu -name 'filename_[100-1000]' 
askubuntu/filename_1

Vì vậy, trong trường hợp này, bạn sẽ xóa một tệp bạn muốn giữ và để lại các tệp cần xóa.


4

Sử dụng lệnh sau:

find . -name 'fileName_[100-100000]' -exec rm {} \;

Điều đó sẽ xóa các tập tin từ 100 đến 100000.

Thêm thông tin: Trang web


Bạn nên sử dụng +tốt hơn là \;- xem tại đây . Hoặc, thậm chí tốt hơn, sử dụng -deletelệnh find .
evilsoup

Tôi đã thử nghiệm điều này và nó chỉ xóa fileName_1. Các[100-100000] nhân vật chỉ khớp với một ký tự duy nhất, vì vậy nó chỉ có thể khớp với 0 hoặc 1.
deltab
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.