Câu trả lời:
Bạn nên sử dụng một lệnh như thế này:
find /group/book/four/word/ -type f -exec wc -l {} + | sort -rn
find
: tìm kiếm các tập tin trên con đường bạn muốn. Nếu bạn không muốn nó đệ quy và find
việc triển khai của bạn hỗ trợ nó, bạn nên thêm -maxdepth 1
ngay trước -exec
tùy chọn.exec
: cho biết lệnh để thực thi wc -l
trên mọi tệp.sort -rn
: sắp xếp các kết quả bằng số theo thứ tự ngược lại. Từ lớn hơn đến thấp hơn.(giả sử tên tệp không chứa ký tự dòng mới).
wc
cũng sẽ in một total
dòng, vì vậy ở đây bạn cũng sẽ nhận được một hoặc nhiều dòng "tổng cộng" trừ khi chỉ có một tệp . Bạn có thể ống grep /
để loại bỏ chúng.
sort
lệnh
Có lẽ là phiên bản đơn giản nhất nếu bạn không cần đệ quy:
wc -l /group/book/four/word/*|sort -n
wc
đếm các dòng (tùy chọn -l
) trong mọi *
tệp (nhưng ẩn) ( ) bên dưới /group/book/four/word/
và sort
sắp xếp kết quả (thông qua đường ống |
) bằng số (tùy chọn -n
).
Ai đó đã đưa ra một nhận xét cho câu trả lời này đề cập grep -rlc
, trước khi để đàn áp nó. Quả thực grep
là một sự thay thế tuyệt vời, đặc biệt nếu bạn cần đệ quy:
grep -rc '^' /group/book/four/word/|tr ':' ' '|sort -n -k2
sẽ tính (tùy chọn -c
) đệ quy (tùy chọn -r
) các dòng khớp ( grep
) '^'
(nghĩa là bắt đầu các dòng) trong thư mục /group/book/four/word/
. Sau đó, bạn phải thay thế dấu hai chấm bằng một khoảng trắng, ví dụ: bằng cách sử dụng tr
, để trợ giúp sort
, mà bạn muốn sắp xếp số (tùy chọn -n
) trên cột thứ hai (tùy chọn -k2
).
Cập nhật: Xem bình luận của Stephane về những hạn chế có thể có và cách bạn thực sự có thể thoát khỏi tr
.
grep -c .
đếm các dòng chứa ít nhất một ký tự hợp lệ. Sử dụng grep -c '^'
để đếm tất cả các dòng (cũng sẽ đếm các ký tự theo sau dòng mới cuối cùng với một số grep
triển khai). Lưu ý rằng không phải tất cả các grep
triển khai đều hỗ trợ a -r
và hành vi khác nhau giữa những người thực hiện. Bạn không cần dịch :
s (dấu hai chấm, không phải dấu chấm phẩy) sang dấu cách sort
. Chỉ cần sử dụng -t:
. Lưu ý rằng giả sử tên tệp không chứa :
hoặc ký tự trống hoặc dòng mới.
wc
đã đưa ra tổng số tiện dụng như vậy nếu bạn vượt qua nhiều con đường. Kết hợp chức năng đó với thẻ hoang dã và đường ống để sort
thực sự sạch sẽ.
Với zsh
:
lines() REPLY=$(wc -l < $REPLY)
printf '%s\n' /group/book/four/word/*(.no+lines)
Chúng tôi xác định một chức năng sắp xếp mới lines
trả lời với số lượng dòng trong tệp. Và chúng tôi sử dụng o+lines
vòng loại toàn cầu cùng với n
(đối với sắp xếp số), xác định cách kết quả của toàn cầu được sắp xếp. ( .
cũng được thêm vào để chỉ kiểm tra các tập tin thông thường).
Điều đó làm cho không có giả định nào về tên ký tự mà tên tệp có thể chứa ngoài các tệp bị ẩn (những tệp bắt đầu bằng .
) được bỏ qua. Thêm D
vòng loại toàn cầu nếu bạn muốn họ là tốt.
bash
...
Bạn không chỉ định liệu bạn cũng muốn các tệp trong bất kỳ thư mục con nào /group/book/four/word
. Các find
giải pháp trong câu trả lời jherran sẽ rơi vào thư mục con. Nếu điều đó là không muốn, thay vào đó hãy sử dụng shell:
for file in ./*; do [ -f "$file" ] && wc -l "$file"; done | sort -n
Nếu tên tệp của bạn có thể chứa dòng mới, bạn có thể sử dụng một cái gì đó như:
for file in ./*; do
[ -f "$file" ] &&
printf "%lu %s\0" "$(wc -l < "$file")" "$file"
done | sort -zn | tr '\0' '\n'
Cuối cùng, nếu bạn làm muốn đi vào trong thư mục con, bạn có thể sử dụng trong bash
4 hoặc cao hơn:
shopt -s globstar
for file in ./**/*; do [ -f "$file" ] && wc -l "$file"; done | sort -n
Lưu ý rằng các phiên bản bash
trước 4.3 đã theo các liên kết tượng trưng khi đệ quy giảm dần cây thư mục (như zsh
's hoặc tcsh
' ***/*
).
Ngoài ra, tất cả các giải pháp ở trên sẽ bỏ qua các tệp ẩn (những tệp có tên bắt đầu bằng a .
, sử dụng shopt -s dotglob
để bao gồm chúng) và cũng sẽ bao gồm số dòng liên kết tượng trưng ( find
cách tiếp cận sẽ không).
-xtype f
trong GNU find hoặc *(-.)
zsh) và sẽ bỏ qua các tệp ẩn.
%lu
trong printf
? Như tôi nhớ, điều đó có nghĩa là số thập phân không dấu dài, nó có thực sự cần thiết không? Tại sao không coi số là một chuỗi? Liệu nó có làm cho một sự khác biệt?
0
thay vì chuỗi trống, tốt hơn một chút. Một số triển khai sắp xếp làm việc với số nguyên không dấu một số có ký hiệu. %lu
Nghe có vẻ như đặt cược an toàn nhất, nhưng có lẽ không quan trọng bằng việc bạn có 2^31
đường dây, điều đó sẽ mất nhiều thời gian.
Nếu bạn muốn cài đặt fd
một công cụ tìm tập tin thực sự nhanh được viết bằng Rust (bạn nên cài đặt nó, dù sao thì thật tuyệt)
fd --type=file . | xargs wc -l | sort -n
Về cơ bản fd
liệt kê các tệp, xargs sẽ chuyển danh sách các tệp tới wc
(viết tắt của đếm từ nhưng chuyển -l sẽ làm cho nó đếm các dòng), cuối cùng nó được sắp xếp từ số lượng dòng ít nhất đến lớn nhất bằng cách sử dụng sort -n
.
ls -l
không đưa ra số lượng dòng.ls -lS
sắp xếp tệp theo kích thước với một sốls
triển khai ( kích thước là số byte trong nội dung).