Làm cách nào để giới hạn số lượng tệp được in bởi ls?


89

Có cách nào để giới hạn số lượng tệp được liệt kê trên một lslệnh không?

Tôi đã nhìn thấy:

ls | head -4

nhưng để có được headhoặc tailđược thực thi, tôi cần đợi lsđể hoàn thành việc thực thi và với các thư mục có số lượng tệp khổng lồ có thể mất thời gian đáng kể.

Tôi muốn thực hiện một lslệnh giới hạn mà không sử dụng headlệnh đó .

Câu trả lời:


109

Bạn đã thử chưa

ls -U | head -4

Điều này nên bỏ qua việc sắp xếp, có lẽ là lý do tại sao lsmất quá nhiều thời gian.

https://stackoverflow.com/questions/40193/quick-ls-command


"ls -U" vẫn đọc toàn bộ thư mục trước khi in ... Tôi nghĩ rằng tôi sẽ viết một tập lệnh nhỏ để giới hạn các tệp, nhưng liên kết câu hỏi đó là tài liệu đọc tốt. Cảm ơn niko.
AndreDurao

5
@AndreDurao, GNU ls -Ukhông nhất thiết phải đọc toàn bộ thư mục trước khi in. Hãy thử strace -e getdents,write ls -U > /dev/nulltrong một thư mục lớn chẳng hạn.
Stéphane Chazelas

Xin lưu ý: nếu bạn muốn thực hiện strace trên OSX, hãy tìm dtrace, lệnh strace là một tiện ích Linux
AndreDurao

12

Nếu phiên bản của bạn lscó cách không sắp xếp các tệp, chẳng hạn như -Uđối với GNU ls , hãy sử dụng nó. Không có tùy chọn, lsđầu tiên sẽ đọc tất cả các tệp, sau đó sắp xếp tên, sau đó bắt đầu in.

Một khả năng khác là chạy find, in tên khi tìm thấy chúng.

find . -name . -o -prune | head

(lưu ý rằng vì headđang làm việc trên các dòng , giả sử tên tệp không chứa ký tự dòng mới).


1
Lưu ý rằng trong trường hợp GNU find(trái ngược với busybox hoặc gia truyền findhoặc GNU ls -U), có vẻ như nó đọc toàn bộ thư mục trước khi bắt đầu in.
Stéphane Chazelas

4

Có lẽ bạn đang cần một công cụ khác hơn ls?

Ví dụ, Randal Schwartz có một mục blog về việc sử dụng perltrên các thư mục lớn có thể chứa một số gợi ý về việc xây dựng một cái gì đó đáp ứng nhu cầu của bạn.

Trong bài đăng trên blog, Randal giải thích rằng cả hai lsfindcố gắng đọc trong tất cả các mục trong thư mục trước khi in bất kỳ, trong khi perlgiải pháp mà ông đề xuất thì không.


Tôi cũng nghĩ rằng đó có thể là lựa chọn tốt nhất, bởi vì cả ls và find đều đọc toàn bộ thư mục trước khi in. Tôi đã lên kế hoạch viết một kịch bản ruby ​​để làm điều đó thay vì ngọc trai, cảm ơn vì điều đó AFresh1!
AndreDurao

1
@AndreDurao, perlcó thể sử dụng readdir(3)như lshoặc find. readdir(3)trên các phiên bản hiện tại của GNU / Linux ít nhất không gọi getdents()cuộc gọi hệ thống với một lớn count (mà thực sự không thường tối ưu hóa biểu diễn bằng cách giảm số lượng hệ thống các cuộc gọi được thực hiện). Nhưng trong trường hợp của bạn, nếu bạn muốn có ít tệp hơn, có vẻ như bạn phải bỏ qua readdirvà sử dụng BSD getdirentries(3)hoặc getdents(2)gọi hệ thống thay thế.
Stéphane Chazelas

3

Nếu hiệu suất không phải là mối quan tâm (như trong câu hỏi đã bị đóng như là một bản sao của câu hỏi này) và bạn muốn liệt kê n tệp đầu tiên (trái ngược với n dòng đầu tiên của đầu ra ls) trong danh sách không phải là đầu ra của ) các tập tin ẩn được sắp xếp theo tên tệp, với zsh, bạn có thể sử dụng:

ls -ld -- *([1,4])

để liệt kê 4 tập tin đầu tiên. zshMặc dù vậy, vẫn sẽ đọc toàn bộ nội dung của thư mục, ngay cả khi bạn bảo nó không sắp xếp theo *(oN[1,4])(lưu ý ls cũng sắp xếp danh sách đó).


1

Có lẽ ít hơn là phù hợp hơn cho nhu cầu của bạn?

 ls /usr/bin | less

Đối với tôi, nó hoạt động tức thời trên một máy tính xách tay 5 tuổi với ổ cứng cổ điển, nhưng đầu cũng nhanh không kém.

Bạn có thể chấm dứt lesssớm với q.

Tôi đoán giả định của bạn về nguồn gốc của độ trễ 1s là sai, nhưng có thể phụ thuộc vào hương vị Unix hoặc vỏ của bạn, ít hơn hoặc lệnh đầu.

Trên Linux, với GNU-ls,

 ls -R /usr | less 

bắt đầu xuất ngay lập tức cho tôi, trong khi toàn bộ đầu ra đang chạy không chạy - vì vậy nó chắc chắn chưa kết thúc, trước khi bắt đầu ít hơn. Bạn có thể kiểm tra, nếu bạn có độ trễ liên tục là 1 giây hoặc có thể hơn, tùy thuộc vào đầu ra hay không.

Tôi đoán sự chậm trễ 1s của bạn có một lý do khác, có lẽ ổ cứng sẽ đi ngủ và cần thức dậy?

Bạn có chậm trễ như vậy cho rất ít tập tin không?


Cảm ơn nhưng tôi đã không tìm kiếm một cái gì đó như thế. Giống như đầu ít hơn được thực hiện với kết quả của toàn bộ lskết quả. Tôi đang tìm cách để bản thân mình giới hạn kết quả.
AndreDurao

@AndreDurao: Chuyển ý kiến ​​của tôi vào câu trả lời.
người dùng không xác định

0
ls -lrth | tail

ls -lrth | tail -n 10

ls -lrth | grep *.gz | tail

Tôi xin lỗi Abhishek, nhưng vấn đề của câu hỏi này là tận dụng lslệnh trên bash. Đường ống lệnh như grep, head, tailhoặc những người khác được thực hiện sau khils
AndreDurao

0
$ cut -f 1,n filename

sẽ thực hiện nhiệm vụ tìm nạp ncác tập tin đầu tiên . nlà số lượng tập tin bạn muốn giải nén. Vì vậy, mã hoàn thành sẽ là:

$ ls|cut -f 1,n file

1
Các ls | cut -f 1,n filelệnh bạn đề nghị sẽ ra trường đầu tiên và thứ n trên mỗi dòng văn bản trong file, và hoàn toàn có thể bỏ qua sản lượng ls. Điều này không làm những gì người đăng ban đầu cần.
telcoM

Có bạn đúng. Chỉ cần điều chỉnh làm cho nó ls | đầu -n ... Điều này chắc chắn sẽ làm nhiệm vụ.
Ramandeep Singh
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.