Saat menghitung baris dengan wc, jangan cetak kesalahan setiap kali direktori


12

Saya ingin menghitung jumlah total baris dalam semua /etcfile tetapi bukan file dalam sub direktori, jadi saya mengetik: wc -l /etc/* | tail -1dan hasilnya seperti:

xxxx is a directory 
yyyy is a directory
total 1752

Pertanyaan saya adalah, bagaimana saya bisa menghilangkan (menghapus) komentar ini, dan adakah cara yang lebih baik untuk melakukan jenis penghitungan ini?


1
Saya pikir menggunakan find bukan 100% wright, karena di / etc tidak hanya file biasa f tetapi juga tautan l. jadi versi ini jauh lebih baik: $ sudo wc -l / etc / * 2> / dev / null | tail -1
Hamza

Jawaban:


14

Anda dapat menampilkan pesan kesalahan ke / dev / null

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

Dengan perintah ini Anda hanya melihat jumlah baris dalam file yang dapat dibaca dunia. Untuk melihat jumlah baris semua file Anda harus meninggikan perintah sudo.

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

8

Pisahkan file dan jalankan wc pada file tersebut

Apa yang wc -l /etc/*dilakukan adalah itu *akan diperluas ke semua item di dalam /etc/direktori. Dengan demikian tujuannya adalah untuk mengisolasi file dan melakukan wcpadanya. Ada beberapa cara untuk melakukannya.

untuk loop dengan tes

The testperintah, atau lebih sering disingkat [dapat digunakan untuk menemukan apakah suatu item adalah file biasa seperti:

[ -f "$FILE" ]

Jadi yang bisa kita lakukan adalah beralih ke semua item /etc/dan jalankan wcjika dan hanya jika perintah di atas mengembalikan true. Seperti itu:

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

Temukan

Kami juga dapat menggunakan finddengan -maxdepth, -type, dan -execbendera

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

  • -maxdepthmenginformasikan menemukan seberapa dalam dalam struktur direktori untuk pergi; Nilai 1 berarti hanya file dalam direktori yang kita inginkan.
  • -type f-omemintanya untuk mencari file biasa, ATAU (diwakili oleh bendera) untuk tautan simbolis (diwakili oleh type l). Semua kebaikan itu tertutup ke dalam tanda kurung yang ()diloloskan \sehingga shell menafsirkannya sebagai bagian dari findperintah, bukan sesuatu yang lain.
  • -exec COMMAND {} +struktur di sini menjalankan perintah apa pun yang kita berikan, yang +menunjukkan untuk mengambil semua file yang ditemukan dan memasukkannya sebagai baris perintah ke PERINTAH.

Untuk menghasilkan total kita bisa menyalurkan output tailseperti itu

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

Catatan samping

Lebih mudah hanya digunakan wc -l /etc/* 2>/dev/null | tail -1, seperti dalam jawaban LD James, namun findharus menjadi bagian dari kebiasaan untuk berurusan dengan file untuk menghindari pemrosesan nama file yang sulit. Untuk info lebih lanjut tentang itu baca esai Cara menangani nama file dengan benar


5

find melakukannya dengan mudah:

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

Keluaran:

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

TETAPI jika Anda hanya ingin nomor sebagai output dan tidak ada yang lain:

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

EDIT : newlineserror kos berkata menang. Hanya menggunakan -execmemperbaikinya. Juga, /etctidak mengandung file seperti itu.

Keluaran:

8169

Seperti yang ditunjukkan oleh kos , perintah di atas dapat direduksi menjadi:

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

EDIT : newlineserror kos berkata menang. Hanya menggunakan -execmemperbaikinya. Juga, /etctidak mengandung file seperti itu.

Keluaran:

8169

4
Apa tujuannya -iname '*'? tidak findcocok dengan semuanya secara default?
steeldriver

@steeldriver - Tidak berhasil tanpa saya '*'.
Raphael

2

Menggunakan z-shell ( zsh), ratu dari shell , bukan bash.

sudo wc -l /etc/*(.) | tail -1
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.