web-dev-qa-db-ja.com

拡張子が.logのすべてのファイルを検索して、ファイルサイズで並べ替えることはできますか?

CentOS 6.8を使用しています

拡張子が.logのすべてのファイルを検索し、ファイルサイズ順に並べ替えて、ファイル名の横にファイルサイズを表示できるかどうかを知りたいのですが。

現在、このコマンドを使用して、拡張子が.logのすべてのファイルを検索しています。

find .  -name \*.log
8
bigmike7801

これは私にとってはうまくいくようです:

find .  -name \*.log -ls | sort -r -n -k7
8
bigmike7801

2つのオプションがあります。 1つはbash中心で、もう1つは楽しみのためのものです。


( shopt -s globstar dotglob; stat --format "%s %n" -- **/*.log | sort -rn )

この:

  • shoptステートメントが現在/実行中のシェルに影響しないように、サブシェルで実行されます。
  • globstarとdotglobを設定します シェルオプション ; globstarでは、**構文を使用してサブディレクトリ内のファイルを照合できます。 dotglobは、シェルグロビングが.で始まるディレクトリに一致することを可能にします
  • statは、ファイルサイズとその名前を収集する方法です。 CentOSシステムにはデフォルトでインストールされます-POSIX仕様ではありません。
  • ここでの実際の作業はglobstar **/*.logによって行われ、現在のディレクトリとすべてのサブディレクトリで一致するファイル名(* .log)が収集されます。
  • 次に、ファイルサイズと名前を逆順に並べ替えて、最初に最大のファイルを取得します(rを付けずに-nを使用して、サイズの昇順で並べ替えます)。

別のbash中心のオプションですが、lsフラグを実行して、引数をサイズで並べ替えます。

shopt -s globstar dotglob
ls -lS **/*.log

# or, in reverse:

ls -lrS **/*.log

システムと忍耐力を行使するには、特定のサイズのファイルを特定の順序で検索します。

for((i=9223372036854775807;i>=0;i--)); do find . -name \*.log -size ${i}c -exec stat --format "%s %n" {} + ; done

これは、9,223,372,036,854,775,807( 9 quintillionfindコマンドを実行し、可能なすべてのサイズの* .logファイルを探し、再度statを呼び出してファイルのサイズと名前のみを表示します。同じサイズのファイルが複数ある場合は、findの{} +構文を含めて、環境に合わせてできるだけ多くのファイル名をstatに渡しました。シェルの整数サイズに基づいて、または最大のログファイルの大きさがわかっている場合は、forループ範囲を調整する必要があります。この「オプション」には、stat呼び出しを単純なlsに置き換えると、POSIXに準拠できるという「利点」があります。

2
Jeff Schaller