Khi đếm các dòng với wc, không in lỗi bất cứ khi nào là một thư mục


12

Tôi muốn đếm tổng số dòng trong tất cả /etccác tệp nhưng không phải các tệp trong thư mục con, vì vậy tôi đã nhập: wc -l /etc/* | tail -1và đầu ra giống như:

xxxx is a directory 
yyyy is a directory
total 1752

Câu hỏi của tôi là, làm thế nào tôi có thể loại bỏ (xóa) những bình luận này, và có cách nào tốt hơn để thực hiện kiểu đếm này không?


1
Tôi nghĩ rằng việc sử dụng find không phải là 100%, bởi vì trong / etc không chỉ có các tệp thông thường f mà còn liên kết l. vì vậy phiên bản này tốt hơn nhiều: $ sudo wc -l / etc / * 2> / dev / null | đuôi -1
Hamza

Câu trả lời:


14

Bạn có thể xuất thông báo lỗi thành / dev / null

$ wc -l /etc/* 2>/dev/null | tail -1

Với lệnh này, bạn chỉ nhìn thấy số lượng dòng trong các tệp có thể đọc được trên thế giới. Để xem số lượng dòng của tất cả các tệp bạn sẽ phải nâng lệnh với sudo.

$ sudo wc -l /etc/* 2>/dev/null | tail -1

8

Cô lập các tập tin và chạy wc trên chúng

Những gì wc -l /etc/**sẽ mở rộng đến tất cả các mục trong /etc/thư mục. Do đó, mục tiêu là cô lập các tệp và thực hiện wctrên chúng. Có một số cách để làm như vậy.

cho vòng lặp với bài kiểm tra

Các testlệnh, hoặc thường xuyên hơn viết tắt là [có thể được dùng để tìm xem tư liệu là một tập tin bình thường như vậy:

[ -f "$FILE" ]

Do đó, những gì chúng ta có thể làm là lặp lại tất cả các mục trong /etc/và chạy wctrên chúng khi và chỉ khi lệnh trên trả về đúng. Thích như vậy:

for i in /etc/*; do [ -f "$i" ] && wc -l "$i" ; done             

tìm thấy

Chúng tôi cũng có thể sử dụng findvới -maxdepth, -type-execcờ

find /etc/ -maxdepth 1 \( -type f -o -type l \) -exec wc -l {} +

  • -maxdepththông báo tìm cách sâu trong cấu trúc thư mục để đi; giá trị 1 chỉ có nghĩa là các tệp trong thư mục chúng ta muốn.
  • -type f bảo nó tìm các tệp thông thường, HOẶC (được biểu thị bằng -ocờ) cho các liên kết sybolic (được đại diện bởi type l). Tất cả những điều tốt đẹp đó được bao bọc trong các dấu ngoặc được ()thoát ra \để shell giải thích chúng như là một phần củafind lệnh, hơn là một cái gì đó khác.
  • -exec COMMAND {} + cấu trúc ở đây chạy bất cứ lệnh nào chúng ta đưa ra, + biểu thị để lấy tất cả các tệp được tìm thấy và nhét chúng làm dòng lệnh lập luận với LỰA CHỌN.

Để sản xuất tổng số chúng ta có thể đầu ra ống tailnhư vậy

$ find /etc/ -maxdepth 1 \( -type f -o -type l \) -exec wc -l {} + | tail -n 1           
[sudo] password for xieerqi: 
 11196  total

Lưu ý phụ

Tuy nhiên, việc sử dụng dễ dàng hơn wc -l /etc/* 2>/dev/null | tail -1, như trong câu trả lời của LD James, tuy nhiên findnên là một phần của thói quen xử lý các tệp để tránh xử lý tên tệp khó. Để biết thêm thông tin về điều đó, hãy đọc bài luận Làm thế nào để xử lý tên tập tin chính xác


5

find làm điều đó dễ dàng:

sudo wc -l $(find /etc/ -maxdepth 1 -type f -iname '*')

Đầu ra:

...
828 /etc/mime.types
25 /etc/ts.conf
66 /etc/inputrc
 0 /etc/subgid-
8169 total

NHƯNG nếu bạn chỉ muốn số là đầu ra và không có gì khác:

sudo wc -l $(find /etc/ -maxdepth 1 -type f -iname '*') | grep total | awk '{print $1}'

EDIT : newlineslỗi kos nói chiếm ưu thế. Chỉ sử dụng-exec cải chính nó. Ngoài ra, /etckhông chứa các tập tin như vậy.

Đầu ra:

8169

Như được chỉ ra bởi kos , lệnh trên có thể được giảm xuống:

sudo wc -l $(find /etc/ -maxdepth 1 -type f -iname '*') | awk 'END {print $1}'

EDIT : newlineslỗi kos nói chiếm ưu thế. Chỉ sử dụng-exec cải chính nó. Ngoài ra, /etckhông chứa các tập tin như vậy.

Đầu ra:

8169

4
Mục đích của nó là -iname '*'gì? không findphù hợp với mọi thứ theo mặc định?
Steeldo

@steel ấn - Nó không hoạt động với tôi mà không có '*'.
Raphael

2

Sử dụng z-shell ( zsh), nữ hoàng của vỏ , thay vì bash.

sudo wc -l /etc/*(.) | tail -1
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.