含まれる行数でソートされたファイルをリストする


32

のファイル内/group/book/four/wordの行数を、それらに含まれる行数でソートするにはどうすればよいですか?

ls -l コマンドはそれらをリストしますが、それらをソートしません


1
ファイルを行数でリストするか、ファイル内の行数をリストするか、またはその両方ですか?ls -l行数を示しません。ls -lSいくつかのls実装でサイズでファイルをソートします(サイズはコンテンツのバイト数です)。
ステファンシャゼル14年

回答:


34

次のようなコマンドを使用する必要があります。

find /group/book/four/word/ -type f -exec wc -l {} + | sort -rn
  • find:必要なパスでファイルを検索します。再帰的でなく、find実装でサポートされている場合は-maxdepth 1-execオプションの直前に追加する必要があります。
  • execwc -lすべてのファイルで実行するようにコマンドに指示します。
  • sort -rn:結果を数値の逆順に並べ替えます。大きいものから低いものへ。

(ファイル名に改行文字が含まれていないことを前提としています)。


複数のファイル(または一部の実装では読み取り可能な複数のファイル)が渡されるとwctotal行も出力されるため、ファイルが1つしかない場合は1つ以上の「合計」行も取得されることに注意してください。 。パイプでgrep /削除できます。
ステファンシャゼル

sortコマンドによる投票
フランシスコ

最小X行のファイルのみを表示するようにフィルタリングするにはどうすればよいですか(例ではX = 0行を除く)?
マトリックス

11

非再帰的

再帰性が必要ない場合、おそらく最も簡単なバージョン:

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/trsort-n-k2

アップデート:可能な制限とどのようにあなたが実際に取り除くことができますについてを参照してくださいステファンさんのコメントtr


3
grep -c .少なくとも1つの有効な文字を含む行をカウントします。grep -c '^'すべての行をカウントするために使用します(一部のgrep実装では、最後の改行の後の末尾の文字もカウントします)。すべてのgrep実装がをサポートするわけではなく-r、動作は動作によって異なることに注意してください。:s(セミコロンではなくコロン)をスペースに変換する必要はありませんsort。使用するだけ-t:です。ファイル名には:空白文字や改行文字が含まれていないことを前提としていることに注意してください。
ステファンシャゼル14年

1
非再帰的なソリューションを投稿していただきありがとうございます。wc複数のパスを渡す場合、このような便利な合計をすべて与えたとは知りませんでした。その機能とワイルドカードおよびパイプの結合sortは本当にきれいです。
Qcom

7

zsh

lines() REPLY=$(wc -l < $REPLY)
printf '%s\n' /group/book/four/word/*(.no+lines)

ファイル内の行数で応答する新しいソート関数を定義linesします。そしてo+linesn(数値の並べ替えのために)glob修飾子を使用し、glob の結果の順序付け方法を定義します。(.通常のファイルのみをチェックするためにも追加されました)。

これは、隠しファイル(で始まるもの.)以外のファイル名に含まれる可能性のある文字は省略されます。Dグロブ修飾子も必要に応じて追加します。


2
OPはタグが付いているbashだけ...
l0b0

7
@ l0b0は、これを必要とする次の人もbashを実行するという意味ではありません。
テルドン

4

のサブディレクトリ内のファイルも必要かどうかは指定しません/group/book/four/wordfindjherranの答えのソリューションは、サブディレクトリに分類されます。それが望ましくない場合は、代わりにシェルを使用します。

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'

あなたがあれば最後に、行うサブディレクトリに下降したいが、あなたはでこれを使用することができますbash4以上:

shopt -s globstar
for file in ./**/*; do [ -f "$file" ] && wc -l "$file"; done | sort -n

bash4.3より前のバージョンは、再帰的にディレクトリツリーを下るときにシンボリックリンクをたどっていました(zsh'やtcsh'など***/*)。

また、上記のすべてのソリューションは、隠されたファイル(名前がで始まるものを無視して.、使用shopt -s dotglobにそれらを含める)をしても(これはシンボリックリンクの行数が含まれますfindアプローチはしません)。


jherranのソリューションとのその他の違いは、通常のファイル(-xtype fGNU findまたは*(-.)zsh)へのシンボリックリンクも考慮し、隠しファイルを省略することです。
ステファンシャゼル14年

@StéphaneChazelasありがとう、明確に。なぜ%luprintf?私が思い出すように、それは長い符号なし10進数を意味します、本当に必要ですか?数字を文字列として扱わないのはなぜですか?違いはありますか?
テルドン

2
wc出力が空の場合(たとえば、ファイルが読み取り可能でないため)、0空の文字列の代わりに展開されますが、これはわずかに優れています。いくつかのソート実装は符号なし整数で動作し、いくつかは符号付きで動作します。%lu最も安全な賭けのように聞こえますが、おそらくあなたが2^31線を持っているかのように重要ではありません。
ステファンシャゼル

1

fdRustで書かれた非常に高速なファイルファインダーをインストールする場合(インストールする必要があります。とにかく持っているのは素晴らしいことです)

fd --type=file . | xargs wc -l | sort -n

基本的fdにファイルをリストし、xargsはファイルのリストを渡しwc(ワードカウントを表しますが、-lを渡すと行数をカウントします)、最後にを使用して最小行数から最大数にソートしsort -nます。

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