/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
-o
sybolicリンク(で表される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 -1
LD 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
デフォルトではすべてに一致しませんか?
'*'
でした。