2015-05-28 19 views
6

Sử dụng ls –agrep, bạn sẽ liệt kê tên của tất cả các tệp trong/usr bắt đầu bằng chữ p hoặc chữ r hoặc chữ cái bằng cách sử dụng lệnh grep đơn lẻ như thế nào?Sử dụng lệnh grep và ls -a

điều này có đúng không?

ls –a | grep [prs] /usr 
+0

Trực tiếp dưới '/ usr' hoặc ở bất kỳ cấp nào dưới'/usr'? –

+0

ngay bên dưới/usr –

+0

'echo/usr/[prs] *' ... – twalberg

Trả lời

4

Nếu bạn đang cố gắng tìm tệp, không sử dụng ls. Sử dụng lệnh find.

find /usr -name '[prs]*' 

Nếu bạn không muốn tìm kiếm toàn bộ cây dưới/usr, làm điều này:

find /usr -maxdepth 1 -name '[prs]*' 
+0

Cô ấy đang liệt kê các tệp, không tìm thấy chúng (tôi nghi ngờ đây là câu hỏi về bài tập về nhà). – Kusalananda

0

tôi muốn ls thư mục và chỉ sau đó áp dụng grep. Ngoài ra, bạn đang bỏ lỡ nhân vật ^ để lọc ra các file mà bắt đầu với những chữ cái:

$ ls -a /usr | grep ^[prs] 
+0

cảm ơn bạn rất nhiều vì sự thấu hiểu! –

0

Tại sao không chỉ

find /usr -type f -name '[prs]*' 
+1

Bởi vì nó sẽ đi qua tất cả mọi thứ dưới '/ usr' và không chỉ'/usr' chính nó. – Kusalananda

+0

Dễ dàng sửa với đối số '-maxdepth'. Nó chắc chắn an toàn hơn nhiều so với phân tích 'ls'. –

3
ls -a /usr | grep '^[prs]' 

sẽ chọn từ đầu ra của ls -a /usr (là danh sách các tệp trong /usr được phân tách bằng ký tự dòng mới) các dòng bắt đầu bằng một trong các số p, r hoặc s ký tự.

Đó có thể là những gì giáo viên của bạn đang mong đợi nhưng nó sai hoặc ít nhất là không đáng tin cậy.

tên tập tin có thể được làm từ nhiều dòng từ kí tự xuống dòng là như hợp lệ một nhân vật như bất kỳ trong một tên tập tin trên Linux hoặc bất kỳ unix. Vì vậy, lệnh đó không trả về các tệp có tên bắt đầu bằng p, q hoặc s, nhưng dòng của tên tệp bắt đầu bằng p, q hoặc s. Nói chung, bạn không thể xử lý đầu ra của ls một cách đáng tin cậy.

-a là bao gồm các tệp bị ẩn, đó là các tệp có tên bắt đầu bằng .. Vì bạn chỉ muốn những người bắt đầu với p, q hoặc s, điều đó không cần thiết.

Lưu ý rằng:

ls /usr | grep ^[pqs] 

sẽ càng sai hơn. Đầu tiên ^ là một nhân vật đặc biệt trong một vài vỏ như vỏ Bourne, rc, es hoặc zsh -o extendedglob (mặc dù OK trong bash hoặc vỏ POSIX khác).

Sau đó, trong hầu hết các vỏ (fish là ngoại lệ đáng chú ý), [pqs] là toán tử tổng hợp. Điều đó có nghĩa là ^[qps] có nghĩa là được mở rộng bởi trình bao tới danh sách các tệp khớp với mẫu đó (liên quan đến thư mục hiện tại).

Vì vậy, trong những vỏ như bash mà không điều trị ^ đặc biệt, nếu có một tập tin gọi là ^p trong thư mục hiện hành, mà sẽ trở thành

ls /usr | grep ^p 

Nếu không có tập tin phù hợp, trong csh, tcsh , zsh hoặc bash -O failglob, bạn sẽ nhận được thông báo lỗi và lệnh sẽ bị hủy. Trong zsh -o extendedglob trong đó ^ là toán tử hình cầu, ^[pqs] có nghĩa là bất kỳ tệp nào nhưng p, q hoặc s.

2

Nhận xét của @twalberg là hoàn hảo cho các tùy chọn bạn đã hỏi. Tiếng vọng bỏ qua các tệp bị ẩn, nhưng những từ đó sẽ được lọc khi bạn chỉ muốn các tệp bắt đầu bằng [prs].
Khi bạn muốn các tệp ẩn cho các bộ lọc khác, một giải pháp tương tự sẽ là ls -ad /usr/[prs]*, trong đó tùy chọn -d sẽ ngăn chặn danh sách các subdir.
Giải pháp đó cũng sẽ hiển thị đường dẫn đầy đủ, điều này có thể bị chặn khi bạn truy cập thư mục trước. Khi bạn muốn ở trong thư mục hiện tại của bạn, hãy sử dụng một subshell cho nó. Tôi sử dụng & & để bỏ qua ls khi thư mục/usr không tồn tại.

(cd /usr && ls -ad [prs]*) 
Các vấn đề liên quan