Xóa các tệp có biểu thức chính quy


40

Tôi đã thử xóa các tệp bắt đầu bằng A và kết thúc bằng 2 số nhưng không thực hiện được.
Những gì tôi đã cố gắng:

rm ^A*[0..9]2$

Tôi sai ở đâu

Câu trả lời:


56

Bạn có thể sử dụng lệnh sau để xóa tất cả các tệp phù hợp với tiêu chí của bạn:

ls | grep -P "^A.*[0-9]{2}$" | xargs -d"\n" rm

Làm thế nào nó hoạt động:

  1. ls liệt kê tất cả các tệp (từng dòng một do kết quả được dẫn).

  2. grep -P "^A.*[0-9]{2}$" lọc danh sách các tệp và chỉ để lại những tệp khớp với biểu thức chính quy ^A.*[0-9]{2}$

    • .*cho biết số lần xuất hiện của ., .ký tự đại diện khớp với bất kỳ ký tự nào.

    • [0-9]{2}chỉ ra chính xác hai lần xuất hiện của [0-9], đó là, bất kỳ chữ số nào.

  3. xargs -d"\n" rmthực hiện rm linemột lần cho mỗi linecái được dẫn đến nó.

Tôi sai ở đâu

Đối với người mới bắt đầu, rmkhông chấp nhận biểu thức chính quy làm đối số. Bên cạnh ký tự đại diện *, mọi nhân vật khác đều được đối xử theo nghĩa đen.

Ngoài ra, biểu hiện thường xuyên của bạn là hơi tắt. Ví dụ: *có nghĩa là bất kỳ sự xuất hiện nào ...trong một biểu thức chính quy, do đó , A*khớp , v.v. và thậm chí là một chuỗi rỗng.AAA

Để biết thêm thông tin, hãy truy cập Thường xuyên-Expressions.info .


3
Cẩn thận với không gian trong tên tập tin.
slhck

1
Công -d"\ntắc sửa lỗi không gian.
Frg

1
Lưu ý - một số bản phân phối (như Mac OS) không có grep -P(Perl regex). grep -Ecó thể làm việc trong trường hợp này.
bluescrubbie

1
Tôi thích sử dụng -Ivới xargsvà luôn kiểm tra bằng các lệnh không gây chết người trước:xargs -d"\n" -I {} echo "{}"
jozxyqk

1
Phân tích cú pháp ls? Xem câu hỏi này mà chỉ đến bài viết này . Vì những cạm bẫy mà bạn có thể rmkhông muốn.
Kamil Maciorowski

45

Hoặc sử dụng find:

find your-directory/ -name 'A*[0-9][0-9]' -delete

Giải pháp này sẽ đối phó với tên tập tin kỳ lạ .


4
Đây là một giải pháp tuyệt vời. Tôi thích nó bởi vì nó đơn giản hơn và bạn có thể bỏ qua cờ -delete ở cuối trước để xem regex của bạn có đúng không trước khi xóa hàng loạt tệp của bạn.
JAMESTONEco

1
Hơn nữa, bạn có nhiều quyền kiểm soát hơn đối với những gì bạn xóa, ví dụ: thêm-type f
Marco Sulla

Điều này có thể được sử dụng để xóa các tập tin và thư mục? Nó không hoạt động cho các thư mục không trống.
Alex

@Alex không, thư mục phải trống (dù sao đó cũng không phải là yêu cầu của OP), bạn có thể sử dụng xargscách tiếp cận với rm -f.
cYrus


1

Giải pháp với regex tốt hơn 200 lần, thậm chí với đó bạn có thể xem tệp nào sẽ bị xóa trước khi sử dụng lệnh, cắt bỏ đường ống cuối cùng:

ls | grep -P "^A.*[0-9]{2}$"

Sau đó, nếu nó đúng, chỉ cần sử dụng:

ls | grep -P "^A.*[0-9]{2}$" | xargs -d "\n" rm

Điều này tốt hơn 200 lần vì nếu bạn làm việc với Unix, điều quan trọng là phải biết cách sử dụng grep. Nó rất mạnh nếu bạn biết cách sử dụng nó.


1
Điều này dường như không thêm nhiều hơn những gì câu trả lời 4 năm của Dennis đã nói.
8bittree

1
"200 lần" là một cách khá cụ thể. Rất nhiều lệnh khác cũng rất mạnh, tất cả những gì bạn cần làm là học cách sử dụng chúng.
glenn jackman

1

Điều này hoạt động trên máy Mac của tôi:

rm $(ls | grep -e '^A*[0..9]2$')


0

find lệnh làm việc với regexes là tốt.

Kiểm tra những tập tin sẽ bị xóa

find . -regex '^A.*[0-9]{2}$'

Xóa các tập tin

find . -regex '^A.*[0-9]{2}$' -delete
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.