各ディレクトリで最大のファイルを再帰的に探したいです。

各ディレクトリで最大のファイルを再帰的に探したいです。

出力には、ディレクトリ名、ファイル名、ファイルサイズが含まれます。コマンドが実行される各ディレクトリに1つ(最大ファイル)があります。

可能であれば、そのディレクトリにあるファイルの平均サイズも教えてください。

目的は、ディレクトリ内の他のファイルよりもはるかに大きいファイルをディレクトリ内で見つけて置き換えることを可能にすることです。

ベストアンサー1

GNU findsortおよびsed(4.2.2以降)を使用してファイルサイズで一度並べ替え、ディレクトリパスで並べ替えます。

find /some/dir -type f -printf '%s %f%h\0' | 
  sort -zrn |
  sort -zut/ -k2 |
  sed -zre 's: ([^/]*)(/.*): \2/\1:'

説明する:

  • ファイルサイズ、名前、パス(最初はスペースで区切り、最後の2つはスペースで区切り/)を印刷し、各エントリはASCII NUL文字で終わります。
  • 次に、NULで区切られた出力を想定し、サイズを使用して数値ソートを実行します(逆順で最大のファイルが最初に表示されます)。
  • 次に、2番目に区切られたフィールド(ファイルを含むディレクトリへのパス)のすべての項目を使用して、最初のsort一意の項目のみを印刷します。/
  • その後、sedディレクトリとファイルの名前を変更して通常のパスを取得します。

読み取り可能な出力を取得するには、ASCII NULを改行文字に置き換えます。

find /some/dir -type f -printf '%s %f%h\0' | 
  sort -zrn |
  sort -zut/ -k2 |
  sed -zre 's: ([^/]*)(/.*): \2/\1:' |
  tr '\0' '\n'

出力例:

$ find /var/log -type f -printf '%s %f%h\0' | sort -zrn | sort -zt/ -uk2 | sed -zre 's: ([^/]*)(/.*): \2/\1:' | tr '\0' '\n'
3090885 /var/log/syslog.1
39789 /var/log/apt/term.log
3968 /var/log/cups/access_log.1
31 /var/log/fsck/checkroot
467020 /var/log/installer/initial-status.gz
44636 /var/log/lightdm/seat0-greeter.log
15149 /var/log/lxd/lxd.log
4932 /var/log/snort/snort.log
3232 /var/log/unattended-upgrades/unattended-upgrades-dpkg.log

おすすめ記事