Làm cách nào để tôi chuyển ls sang grep và xóa các tệp được lọc bởi grep?


33

Tôi muốn xóa một số gói trong tập tin nhà của tôi, nhưng tên tệp quá dài ( google-chrome-stable_current_i386.deb). Vì vậy, tôi quyết định sử dụng lệnh ls|grep chrome|rmđể dẫn các tệp đến grep để lọc tệp chrome và sau đó xóa tệp đó. Nó không hoạt động, vì vậy tôi muốn xem làm thế nào tôi có thể làm điều này.


22
rm -i *chrome*.deb
Lambert

28
Nói chung, tôi không thích khi mọi người đăng câu trả lời "không làm điều đó", nhưng đây là một trong những ví dụ hay nhất về vấn đề XY tôi từng thấy. Câu hỏi thực sự của bạn là "làm cách nào để nhanh chóng xóa một tệp có tên tệp dài mà không cần nhập toàn bộ nội dung" và có rất nhiều cách hay không liên quan đến việc lấy đầu ra từls
Michael Mrozek

5
Chỉ cần sử dụng find- find . -name "*chrome*" -delete.
Boris the Spider


3
Hai xu của tôi với tư cách là người dùng StackExchange: trong tương lai, hãy đặt câu hỏi của bạn theo cách chung chung hơn trong khi cung cấp chi tiết về những gì bạn đã thử. "Làm cách nào để xóa bất kỳ tệp nào trong một thư mục có một chuỗi nhất định trong tên tệp?" có thể là một cách tốt hơn để diễn đạt nó. Sau đó, bạn chỉ đơn giản là có thể thêm, như là một sang một bên, mà bạn đã cố gắng ống lsqua grepđến rmnhưng không thể làm cho nó làm việc. Bằng cách đó, bạn sẽ nhận được một hoặc hai câu trả lời hay về cách "chính xác" hoặc "dễ nhất" để hoàn thành nhiệm vụ của mình thay vì buộc ai đó phải trả lời tốt cho bạn về một giải pháp không hiệu quả.
Adrian

Câu trả lời:


56

Điều này gần như làm tôi nhăn nhó.

  1. Bạn có thể muốn dừng việc chĩa khẩu súng đó vào chân mình. Về cơ bản bất kỳ loại phân tích cú pháp của lssẽ được nhiều phức tạp và dễ bị lỗi hơn các phương pháp thành lập như find [...] -exechoặc những đống .
  2. Trừ khi ai đó cài đặt một bản phân phối troll cho bạn, vỏ của bạn đã Tabhoàn tất. Chỉ cần gõ rm googlevà nhấn Tab. Nếu nó không hoàn thành ngay lập tức, nhấn Tabmột lần nữa để xem danh sách các tập tin phù hợp. Nhập thêm các ký tự của tên tệp để thu hẹp nó cho đến khi hoàn thành, sau đó chạy lệnh.
  3. Ống ! = Thông số . Đầu vào tiêu chuẩn là một luồng dữ liệu nhị phân có thể được cung cấp cho một lệnh không đồng bộ. Các tham số là các chuỗi phân tách không gian được truyền một lần và chỉ một lần cho một lệnh khi chạy nó. Đây là rất hiếm khi thay thế cho nhau.

1
Xin lỗi nếu nó có vẻ như một câu hỏi n00b. Tôi biết rằng sử dụng nói chung là ổn, vì gói được nêu là gói duy nhất có "chrome" được nêu trong đó. Do đó, sử dụng grep sẽ chỉ lọc ra một tệp. Tôi còn khá mới với linux và tôi đã thực hiện rất nhiều tập lệnh bash, nhưng tôi chưa biết tất cả mọi thứ: P. Khắc nghiệt, anh chàng.
SpecialBomb

5
Không có nghĩa là khắc nghiệt, nhưng vỏ là một môi trường khắc nghiệt và không thể tha thứ, ẩn đằng sau một bề mặt thân thiện với người dùng. Làm mọi thứ an toàn là đủ khó, không bao giờ để tâm một cách an toàn hoặc thậm chí chính xác .
l0b0

2
@ SpecialBomb Đây là câu trả lời đúng duy nhất. Giải thích làm thế nào để nhắm chính xác khẩu súng ngắn nói để cắt đứt chân của một người, như những câu trả lời khác làm, chắc chắn không phải là cách để đi. Đặc biệt cẩn thận khi thực hiện một cách mù quáng rm- có lẽ đó là cách duy nhất phổ biến hơn để xào phân phối của bạn.
Boris the Spider

@BoristheSpider Heh, tôi chắc chắn đã hai lần cài đặt trình điều khiển card đồ họa AMD. Tôi đã hỏi một câu hỏi về điều đó mặc dù. AMD thật kinh khủng, vì vậy tôi đã hỏi liệu có cách khắc phục phổ biến nào hoặc phương pháp chơi game tốt hơn với Linux trên thẻ AMD không.
SpecialBomb

34

Bạn cũng có thể sử dụng lệnh find với ký tự đại diện:

find . -maxdepth 1 -name '*chrome*' -delete

Lưu ý rằng đối số "-maxdepth" đảm bảo rằng find chỉ hoạt động trong thư mục hiện tại và không tái diễn vào các thư mục con.


1
Gợi ý cải tiến: (a) sử dụng -inamecho tên tệp không phân biệt chữ hoa chữ thường (b) để xargssử dụng -print0cờ cho find-0cờ cho xargs. Việc sử dụng xargscho phép bạn thực hiện những việc như xóa "tương tác" (xác nhận xóa foo?).
Christopher Schultz

3
Không cần chuyển sang xargs nếu bạn sử dụng tùy chọn -exec:find . -name '*chrome*' -exec rm -i {} +
Johnny

4
Điều này cũng sẽ xóa đệ quy vào các thư mục con? Bạn có thể cần chỉ định maxdepthlà 1.
Tyzoid 8/12/2015

32

Bạn đã có ý tưởng đúng, chỉ cần bỏ lỡ một số chi tiết. Vì bạn đang xử lý một danh sách sắp tới STDIN và rmmong đợi các tham số, bạn cần sử dụng xargs.

Như vậy:

ls | grep chrome | xargs rm

Nên cung cấp cho bạn những gì bạn muốn.

Lưu ý rằng nếu bạn muốn xóa mọi thứ ngoài chrometệp, bạn chỉ cần thêm -vvào grepcâu lệnh.

Lưu ý rằng, theo các câu trả lời khác cho câu hỏi này, đây có lẽ là một cách tồi để hoàn thành những gì bạn muốn hoàn thành.


Với -v, điều này sẽ không xóa tất cả mọi thứ trừ các tập tin phù hợp chrome? Tôi không nghĩ đó là những gì OP muốn ...
akivajgordon

Nhìn lại, bạn đã đúng. OP muốn "lọc ra tệp chrome", nhưng sau đó muốn xóa nó.
Giăng

Điều này có vẻ phức tạp không cần thiết, so với một "rm -i chrome " đơn giản
chander 7/12/2015

5
Câu trả lời được chấp nhận hoạt động, nhưng hãy xem câu trả lời dưới đây giải thích tại sao đó là một ý tưởng tồi. (Đăng bình luận này ở đây chỉ vì lợi ích của những người dừng lại ngay khi họ thấy dấu kiểm "được chấp nhận".)
Jim Davis

1
Điều này, câu trả lời được chấp nhận "hoạt động" chỉ khi không có tên tệp "lạ" trong lsđầu ra. Tên tập tin với không gian sẽ phá hỏng điều này. Điều này cũng nguy hiểm nếu ai đó có thể tạo tên tệp bằng nước sốt đặc biệt trong thư mục nơi bạn chạy tệp này. Vì nhiều hơn một người đã chỉ ra, đừng phân tích đầu ra của ls !
Stephen P

11

Không bao giờ phân tích đầu ra của ls
Đề xuất của tôi là tránh phân tích đầu ra của ls [ 1 ] , thậm chí nhiều hơn nếu kết hợp với dellệnh. Điều này vì nhiều lý do chủ yếu liên quan đến các ký tự không mong muốn và không thông thường được cho phép trong tên tệp.

Ngay cả khi bạn mong đợi rằng tên tệp thuộc các gói Linux sẽ "hoạt động tốt" , dù sao thì vấn đề này vẫn có thể xuất hiện nếu các tệp khác có trong cùng thư mục nhưng bạn không biết hoặc không chú ý.

Sử dụng tốt hơn find, mở rộng tab (bắt đầu viết tên và nhấn Tab), mở rộng tên tệp [ 2 ] dưới dạng *MyKey*...


Một giải pháp nhanh chóng
Vì bạn muốn chọn tất cả các gói (kết thúc bằng .deb) với "google" bên trong, bạn có thể tạo yêu cầu của mình bằng ký tự đại diện * *google*.debvà thực hiện đơn giản

rm -i *google*.deb 

sẽ chọn từng tên tệp với "google" ở giữa sẽ kết thúc để .debhiện diện trong thư mục hiện tại. Tùy chọn -i(tương tác) sẽ nhắc xác nhận, một thói quen tốt khi bạn xóa các tệp có phần mở rộng tham số.


Một giải pháp gần với triết lý về nỗ lực của bạn
Nếu mục đích của bạn là xây dựng đoạn lệnh của bạn sau từng mảnh, vì vậy bạn đã thực hiện ls, sau ls | grep googlechỉ sau khi bạn kiểm tra đầu ra của mình, bạn có thể thực hiện nó trong một mạng con $(...)với

rm -i $(ls | grep google)

Một cách nhanh hơn và nguy hiểm hơn [ 3 ] , là sử dụng!!

ls | grep google
rm -i $(!!)

Điều đó sẽ thực hiện lệnh cuối cùng kết thúc trong lịch sử của bạn . Bạn có thể tự bảo vệ mình khỏi thực tế là bạn không có quyền kiểm soát trực quan về dòng mà bạn sẽ thực hiện nếu bạn đã bật trước các tùy chọn shell histverifyvới shopt -s histverify.


5
touch 0 1 2 3 4 5 6 7 8 9
find . -name \[0-9] -ok rm {} \;

< rm ... ./0 > ? y
< rm ... ./9 > ? y
< rm ... ./8 > ? y
< rm ... ./7 > ? y
< rm ... ./6 > ? y
< rm ... ./5 > ? y
< rm ... ./4 > ? y
< rm ... ./3 > ? y
< rm ... ./2 > ? y
< rm ... ./1 > ? y
^C

... sử dụng -name '*c*.deb'hoặc một số mô hình khác phù hợp với bạn thay vào đó.


2

rmkhông chấp nhận đầu vào từ stdin. Bạn sẽ cần phải làm một cái gì đó nhưls google-chrome* | xargs rm

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.