Điểm:0

ls để (big airquotes) "gộp" chúng bằng grep sau đó rm tất cả kết quả tìm thấy trong một lệnh...Điều này có thể thực hiện được không?

lá cờ in

Vấn đề đơn giản nhưng tôi không đủ khả năng trong các lệnh bash để thực hiện đầy đủ nguyện vọng của mình. Hy vọng sẽ lượm lặt được nếu không phải là lệnh mà tôi đang tìm kiếm thì có lẽ tôi có thể tìm hiểu tài liệu ở đâu để hoàn thành nhiệm vụ của mình. Đây là vấn đề của tôi + những gì tôi đã thử cho đến nay: Vì vậy, tôi có một ổ cứng đã qua sử dụng và có một số điểm bất thường (có lợi cho sự nghi ngờ) bị bỏ lại với tên của chúng là tên tệp khiến tôi không thể nhận ra điều này như bây giờ là ổ cứng của tôi. Tôi đã có thể truy cập điểm gắn kết gốc và đã tìm thấy các tệp tôi muốn xóa bằng ''' ls -A | grep abcdef ''' có cách nào để chuyển danh sách grep'd thành lệnh '''rm -f''' sau đó không vì khi tôi thử '''ls -A | grep abcdef | rm''' nó không hoạt động tốt. Sau thất bại to lớn đó (chính xác thì bạn đang làm gì vậy?!) Tôi đã thử ''' ls -A | grep abcdef <| rm ''' cộng với nhiều lần lặp lại khác của cổ phiếu tương tự nhưng không có kết quả. Một lần nữa, tôi không nhất thiết mong muốn "câu trả lời dễ dàng" nhưng có lẽ một vị trí chính xác nơi tôi có thể nhận được một số hỗ trợ hữu hạn trong việc chuyển hướng đầu ra sẽ rất tuyệt. (Tôi đã tự trả lời chưa? Việc thả nó xuống /dev/null sau đó có làm những gì tôi cần không?...Tôi sẽ thử điều đó nhưng hy vọng sẽ yêu cầu một số hỗ trợ chuyển hướng lệnh) Bất kỳ trợ giúp nào cũng sẽ được đánh giá cao, cảm ơn.

vanadium avatar
lá cờ cn
Cố gắng ít dài dòng hơn và tập trung vào vấn đề hơn. Chỉ rõ "nhiệm vụ" của bạn là gì, tức là mục tiêu cuối cùng của bạn là gì. Cân nhắc sử dụng định dạng mã để phân biệt mã đầu cuối với văn bản, điều này cũng sẽ giúp cải thiện khả năng đọc. Các câu hỏi rõ ràng, dễ đọc có nhiều khả năng thu hút các câu trả lời rõ ràng, dễ đọc hơn.
guiverc avatar
lá cờ cn
Tôi sẽ viết lệnh `find` để tìm các tệp bạn muốn, sau đó chỉ cần thêm tùy chọn `-delete` vào lệnh đó (tức là để lệnh `find` đã làm của bạn xóa các tệp mà nó tìm thấy); nhưng điều đó không sử dụng đường ống như bạn đang yêu cầu.
lá cờ hr
Có vẻ như bạn đang tìm kiếm `xargs`... tuy nhiên như @guiverc đã lưu ý, `find` thường được ưu tiên hơn `ls` + `grep` + (xargs) `rm`
Jake Baldwin avatar
lá cờ in
@vanadium - Tôi nghĩ tôi đã làm. Tôi đang sử dụng thiết bị di động để thực hiện bài đăng này và ở dưới cùng của hộp mô tả, nó hướng dẫn cách thực hiện điều đó nên tôi đoán rằng nó không hiển thị trong hộp nhập liệu của tôi. Tôi có một số kết quả từ lệnh grep'd "ls" mà tôi muốn là rm'd thay vì hiển thị trong một danh sách dài.
Jake Baldwin avatar
lá cờ in
@guiverc - Tôi sẽ chỉ "tìm" chúng nhưng tôi muốn tất cả các tệp có tên cụ thể ở bất kỳ đâu trong đó nên tôi "ls -AR | grep abc" là cách tốt nhất tôi có thể tìm đến. Nếu có cách nào tốt hơn với "tìm", vui lòng chỉ cho tôi. (Không mỉa mai)
Jake Baldwin avatar
lá cờ in
@steeldriver - Tôi sẽ xem xét nó. xargs.... Tôi sẽ phải đọc trang hướng dẫn trên đó, cảm ơn mọi người.
guiverc avatar
lá cờ cn
`find` là một lệnh cho phép regex giống như những gì bạn đang sử dụng (và phức tạp hơn nhiều)... tức là. sử dụng mệnh đề `-name`. Một điều tốt với *unix* (posix, hoặc GNU/Linux) là có nhiều cách để hoàn thành mọi thứ. Tôi tin đó là điểm @vanadium; cho chúng tôi biết những gì bạn muốn đạt được và bạn có thể có nhiều kết quả đạt được những gì bạn muốn (`find -name '*paper*'` sẽ tìm tên của các tệp/thư mục chứa từ paper (ở bất kỳ đâu)... kể cả tìm kiếm trong các thư mục con bên dưới $PWD hiện tại của bạn ... việc thêm `-delete` vào đó sẽ khiến các tệp/thư mục đó bị xóa
Điểm:2
lá cờ hr

một đường ống (|) kết nối luồng đầu ra tiêu chuẩn của quy trình với luồng đầu vào tiêu chuẩn của quy trình khác. Bạn không thể sử dụng điều đó để chuyển danh sách tên tệp tới rừm trực tiếp, bởi vì rừm không đọc tên tệp từ đầu vào tiêu chuẩn của nó.

Bạn có thể sử dụng xargs chương trình để đọc danh sách trên nó là đầu vào tiêu chuẩn và "gói" tên tệp cho rừm:

ls -A | grep abcdef | xargs rm

nhưng đừng, có tất cả các loại vấn đề với cách tiếp cận này - đặc biệt là tiếng kêu xử lý đầu vào từng dòng, trong khi xargs phân chia đầu vào trên khoảng trắng theo mặc định. Bạn có thể làm cho nó tốt hơn bằng cách sử dụng một cái gì đó như

shopt -s dotglob # mô phỏng tập tin ẩn ls -A "gần như tất cả"
printf '%s\0' * | grep -z abcdef | xargs -0 rm

trong đó sử dụng ký tự null ASCII để phân tách tên tệp một cách rõ ràng. Một cách tiếp cận thường được ưa thích là sử dụng tìm thấy chỉ huy:

tìm thấy . -maxdepth 1 -name '*abcdef*' # -delete

(Tôi đã để lại -xóa bỏ đã nhận xét ngay bây giờ - đảm bảo hoàn toàn chắc chắn rằng đó là tìm thấynhập đúng tệp trước khi bỏ ghi chú vì không có thao tác "hoàn tác").

Lưu ý rằng tìm thấy đệ quy vào các thư mục con theo mặc định - nếu bạn muốn tương đương với ls -R sau đó loại bỏ -độ sâu tối đa 1. Bạn có thể thêm -loại f để chỉ tìm và xóa tệp (bỏ qua thư mục).

Cũng lưu ý rằng tìm tên sử dụng các mẫu toàn cầu shell thay vì các biểu thức chính quy được sử dụng bởi tiếng kêu (nó cũng có một -regex khớp vị ngữ nhưng điều đó dường như không cần thiết ở đây).

Xem thêm Tại sao không phải phân tích cú pháp ls (và thay vào đó phải làm gì)?

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.