wcで行をカウントするとき、ディレクトリがいつでもエラーを出力しない


12

/etcサブディレクトリ内のファイルではなく、すべてのファイル内の行の総数をカウントするため、次のように入力しました。wc -l /etc/* | tail -1出力は次のようになります。

xxxx is a directory 
yyyy is a directory
total 1752

私の質問は、これらのコメントをどのように削除(削除)できますか?このタイプのカウントを行うより良い方法はありますか?


1
/ etcには通常のファイルfだけでなくリンクlもあるので、findを使用することは100%ライトではないと思います。したがって、このバージョンははるかに優れています:$ sudo wc -l / etc / * 2> / dev / null | テール-1
ハムザ

回答:


14

エラーメッセージを/ dev / nullに出力できます

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

このコマンドを使用すると、ファイル内の読み取り可能な行数のみが表示されます。すべてのファイルの行数を表示するには、でコマンドを昇格する必要がありますsudo

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

8

ファイルを分離し、それらに対してwcを実行します

これwc -l /etc/*は、ディレクトリ*内のすべてのアイテムに展開されます/etc/。したがって、目標はファイルを分離して実行wcすることです。これにはいくつかの方法があります。

テスト付きforループ

testより頻繁にと略記コマンド、または[使用することができ、アイテムがそうのような通常のファイルであるかどうかを見つけるために:

[ -f "$FILE" ]

したがって、できることは、上記のコマンドがtrueを返す場合にのみ、すべてのアイテムを反復処理して/etc/実行wcすることです。そのようです:

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

見つける

また、使用することができfind-maxdepth-type-execのフラグ

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

  • -maxdepthディレクトリ構造の深さを知ることができます。値1は、必要なディレクトリ内のファイルのみを意味します。
  • -type f-osybolicリンク(で表されるtype l)の 通常のファイル、またはOR(フラグで表される)を探すように指示します。その良さはすべて、()エスケープされた括弧で囲まれている\ため、シェルはそれらをfind他のコマンドではなく、コマンドの一部として解釈します。
  • -exec COMMAND {} +ここでの構造は、与えられたコマンドを+すべて実行し、見つかったすべてのファイルを取得して、コマンドへのコマンドライン引数として詰めることを示します。

合計を生成するには、出力を次のtailようにパイプすることができます

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

サイドノート

wc -l /etc/* 2>/dev/null | tail -1LD Jamesの答えのように、を使用する方が簡単ですfindが、難しいファイル名の処理を避けるためにファイルを処理する習慣の一部である必要があります。詳細については、エッセイ「ファイル名を正しく処理する方法」を参照してください。


5

find 簡単にできます:

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

出力:

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

しかし、あなたは、次の場合にだけ数をしたい出力し、他には何通り:

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

EDITnewlinesエラー戦績勝っを言いました。使用するだけで-exec修正されます。また、/etcそのようなファイルは含まれていません。

出力:

8169

kosが指すように、上記のコマンドは次のように縮小できます。

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

EDITnewlinesエラー戦績勝っを言いました。使用するだけで-exec修正されます。また、/etcそのようなファイルは含まれていません。

出力:

8169

4
の目的は-iname '*'何ですか?findデフォルトではすべてに一致しませんか?
スチールドライバー

@steeldriver-なしでは機能しません'*'でした。
ラファエル

2

bashの代わりに、シェルの女王であるz-shellzsh)を使用します。

sudo wc -l /etc/*(.) | tail -1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.