回答:
次のようなコマンドを使用する必要があります。
find /group/book/four/word/ -type f -exec wc -l {} + | sort -rn
find
:必要なパスでファイルを検索します。再帰的でなく、find
実装でサポートされている場合は-maxdepth 1
、-exec
オプションの直前に追加する必要があります。exec
:wc -l
すべてのファイルで実行するようにコマンドに指示します。sort -rn
:結果を数値の逆順に並べ替えます。大きいものから低いものへ。(ファイル名に改行文字が含まれていないことを前提としています)。
wc
、total
行も出力されるため、ファイルが1つしかない場合は1つ以上の「合計」行も取得されることに注意してください。 。パイプでgrep /
削除できます。
sort
コマンドによる投票
再帰性が必要ない場合、おそらく最も簡単なバージョン:
wc -l /group/book/four/word/*|sort -n
wc
カウントライン(オプション-l
ごとで)(ただし、非表示)( *
)の下にあるファイル/group/book/four/word/
、およびsort
(パイプを通して結果をソート|
)数値(オプション-n
)。
grep -rlc
それを抑制する前に、誰かがこの回答にコメントしてコメントしました。確かにgrep
、特に再帰性が必要な場合に最適な選択肢です。
grep -rc '^' /group/book/four/word/|tr ':' ' '|sort -n -k2
ディレクトリ内の()(つまり行の先頭)に一致する-c
(オプション-r
)行を再帰的に(オプション)カウントします。次に、コロンをスペースで置き換える必要があります。たとえば、を使用して、2番目の列(オプション)で数値的に並べ替える(オプション)ために使用します。grep
'^'
/group/book/four/word/
tr
sort
-n
-k2
アップデート:可能な制限とどのようにあなたが実際に取り除くことができますについてを参照してくださいステファンさんのコメントtr
。
grep -c .
少なくとも1つの有効な文字を含む行をカウントします。grep -c '^'
すべての行をカウントするために使用します(一部のgrep
実装では、最後の改行の後の末尾の文字もカウントします)。すべてのgrep
実装がをサポートするわけではなく-r
、動作は動作によって異なることに注意してください。:
s(セミコロンではなくコロン)をスペースに変換する必要はありませんsort
。使用するだけ-t:
です。ファイル名には:
空白文字や改行文字が含まれていないことを前提としていることに注意してください。
wc
複数のパスを渡す場合、このような便利な合計をすべて与えたとは知りませんでした。その機能とワイルドカードおよびパイプの結合sort
は本当にきれいです。
でzsh
:
lines() REPLY=$(wc -l < $REPLY)
printf '%s\n' /group/book/four/word/*(.no+lines)
ファイル内の行数で応答する新しいソート関数を定義lines
します。そしてo+lines
、n
(数値の並べ替えのために)glob修飾子を使用し、glob の結果の順序付け方法を定義します。(.
通常のファイルのみをチェックするためにも追加されました)。
これは、隠しファイル(で始まるもの.
)以外のファイル名に含まれる可能性のある文字は省略されます。D
グロブ修飾子も必要に応じて追加します。
bash
だけ...
のサブディレクトリ内のファイルも必要かどうかは指定しません/group/book/four/word
。find
jherranの答えのソリューションは、サブディレクトリに分類されます。それが望ましくない場合は、代わりにシェルを使用します。
for file in ./*; do [ -f "$file" ] && wc -l "$file"; done | sort -n
ファイル名に改行を含めることができる場合は、次のようなものを使用できます。
for file in ./*; do
[ -f "$file" ] &&
printf "%lu %s\0" "$(wc -l < "$file")" "$file"
done | sort -zn | tr '\0' '\n'
あなたがあれば最後に、行うサブディレクトリに下降したいが、あなたはでこれを使用することができますbash
4以上:
shopt -s globstar
for file in ./**/*; do [ -f "$file" ] && wc -l "$file"; done | sort -n
bash
4.3より前のバージョンは、再帰的にディレクトリツリーを下るときにシンボリックリンクをたどっていました(zsh
'やtcsh
'など***/*
)。
また、上記のすべてのソリューションは、隠されたファイル(名前がで始まるものを無視して.
、使用shopt -s dotglob
にそれらを含める)をしても(これはシンボリックリンクの行数が含まれますfind
アプローチはしません)。
-xtype f
GNU findまたは*(-.)
zsh)へのシンボリックリンクも考慮し、隠しファイルを省略することです。
%lu
中printf
?私が思い出すように、それは長い符号なし10進数を意味します、本当に必要ですか?数字を文字列として扱わないのはなぜですか?違いはありますか?
0
空の文字列の代わりに展開されますが、これはわずかに優れています。いくつかのソート実装は符号なし整数で動作し、いくつかは符号付きで動作します。%lu
最も安全な賭けのように聞こえますが、おそらくあなたが2^31
線を持っているかのように重要ではありません。
ls -l
行数を示しません。ls -lS
いくつかのls
実装でサイズでファイルをソートします(サイズはコンテンツのバイト数です)。