Cái nào hiệu quả hơn, ls hay ls -l?


7

Theo tôi hiểu, lslệnh gọi getdents, trả về tối đa x số mục nhập thư mục. Có bất kỳ cuộc gọi hệ thống khác liên quan? Nếu tôi chạy ls -l, có cuộc gọi hệ thống nào nữa không? Tôi đang cố gắng xác định nếu ls -lđắt hơn và do đó chậm hơn ls.


3
Bạn có thể sử dụng strace lsstrace ls -lđể xem các cuộc gọi hệ thống cho mỗi lệnh.
Timothy Martin

Tôi đã chạy các bước trên một hệ thống Linux. Tôi giả sử kết quả là giống hệt nhau cho một hệ thống Unix.
100503

1
Nó không thành vấn đề hiệu quả hơn, bởi vì hiệu quả chỉ quan trọng trong tự động hóa và, vì lskhông dành cho tự động hóa, nên luôn có những cách hiệu quả và an toàn hơn để chiếu sáng hệ thống tập tin cho mục đích lập trình.
kojiro

Câu trả lời:


15

/bin/lsthường sắp xếp đầu ra. Tôi không chắc câu hỏi "hiệu quả" của bạn chỉ là các cuộc gọi hệ thống hay toàn bộ công việc đã hoàn thành, nhưng /bin/ls -fcó lẽ sẽ làm ít việc nhất. Nó chỉ trả về tên tệp theo thứ tự thư mục. Không sắp xếp, không có tra cứu inode bổ sung để có được siêu dữ liệu (như ls -lsẽ làm).

Ngoài ra, nếu mặc định của bạn lslà tô màu, nó có thể đang làm tương đương với ls -lbất cứ cách nào để nó có thể cho biết cách tô màu đầu ra.


5
ls -lthực hiện một statcho mỗi tập tin duy nhất. Nó cần inodes cho mỗi tệp để có được thông tin như kích thước, sự cho phép hoặc số lượng liên kết cứng.
pqnet

13

ls -lchắc chắn là đắt hơn, vì nó phải truy vấn hệ thống tệp cho siêu dữ liệu như chủ sở hữu, nhóm, quyền, thời gian truy cập, v.v. Vanilla /bin/lschỉ phải tìm tên của các mục trong thư mục được liệt kê.

Lưu ý rằng lscó thể được đặt bí danh trên hệ thống của bạn với một cái gì đó ít vanilla hơn /bin/ls. Chạy type lsđể xem nếu đó là trường hợp.


Vanilla ls lấy số inode và sau đó phải tra cứu tên thư mục và tên tệp từ mỗi inode. Điều này có đúng không? ls -l phải tiếp cận với các nút giống như trên nhưng cũng phải đọc siêu dữ liệu từ mỗi nút ngoài tên tệp hoặc tên thư mục. Điều này có đúng không?
100503

Có, nhưng tùy thuộc vào loại hệ thống tệp bạn có, cách cấu hình và kiểu sử dụng của nó, có thể tốn kém để tra cứu siêu dữ liệu. Siêu dữ liệu có thể không được lưu trữ cùng với các nút - nó có thể được lưu trữ trên một phân vùng khác hoặc thậm chí trên toàn bộ phần cứng khác nhau. (Tuy nhiên, nếu bạn đang sử dụng máy tính để bàn tiêu chuẩn, thì có lẽ không phải vậy.) Đây là lý do tại sao trang dành cho người đàn ông finddành thời gian để nói về các tìm kiếm hiệu quả so với không hiệu quả; tìm kiếm mà chỉ cần nhìn vào tên tập tin là hiệu quả hơn nhiều.
dg99

1
@ user100503: Tôi khá chắc chắn rằng thư mục chứa các tên có số inode; bạn không vào nút để lấy tên (nếu bạn có một số liên kết cứng đến một tệp, tên tệp nào sẽ nằm trong nút?)
celtschk

@celtschk Vâng, tôi nghĩ rằng câu trả lời của tôi quá dài dòng. Tôi đã chỉnh sửa nó để loại bỏ một số nhầm lẫn.
dg99

2
@ user100503, không, không phải vậy. Dữ liệu trong thư mục có thể được coi là một danh sách các tên và các nút liên kết của chúng. Đó là mục đích chính của thư mục. Tên không tồn tại bên trong inode. Như celtschk đã đề cập, các nút liên kết nhân không có một tên duy nhất.
BowlOfRed
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.