/etcサブディレクトリ内のファイルではなく、すべてのファイル内の行の総数をカウントするため、次のように入力しました。wc -l /etc/* | tail -1出力は次のようになります。
xxxx is a directory
yyyy is a directory
total 1752
私の質問は、これらのコメントをどのように削除(削除)できますか?このタイプのカウントを行うより良い方法はありますか?
/etcサブディレクトリ内のファイルではなく、すべてのファイル内の行の総数をカウントするため、次のように入力しました。wc -l /etc/* | tail -1出力は次のようになります。
xxxx is a directory
yyyy is a directory
total 1752
私の質問は、これらのコメントをどのように削除(削除)できますか?このタイプのカウントを行うより良い方法はありますか?
回答:
これwc -l /etc/*は、ディレクトリ*内のすべてのアイテムに展開されます/etc/。したがって、目標はファイルを分離して実行wcすることです。これにはいくつかの方法があります。
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が、難しいファイル名の処理を避けるためにファイルを処理する習慣の一部である必要があります。詳細については、エッセイ「ファイル名を正しく処理する方法」を参照してください。
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}'
EDIT:newlinesエラー戦績勝っを言いました。使用するだけで-exec修正されます。また、/etcそのようなファイルは含まれていません。
出力:
8169
kosが指すように、上記のコマンドは次のように縮小できます。
sudo wc -l $(find /etc/ -maxdepth 1 -type f -iname '*') | awk 'END {print $1}'
EDIT:newlinesエラー戦績勝っを言いました。使用するだけで-exec修正されます。また、/etcそのようなファイルは含まれていません。
出力:
8169
-iname '*'何ですか?findデフォルトではすべてに一致しませんか?
'*'でした。