ファイルシステムで最大のファイルを見つけるためにfind + awkを使用できないのはなぜですか?

ファイルシステムで最大のファイルを見つけるためにfind + awkを使用できないのはなぜですか?

なぜこれがうまくいかないのですか?
find / -ls 2>/dev/null | awk '$7 > max {max = $7}; END {print max}'
これは働きます:
find / -printf "%s\n" 2>/dev/null | sort -nr |head -n1

1つ目は7ドルがファイルサイズなのになぜできないのかわかりませんね。

ベストアンサー1

出力から7番目のフィールドのサイズを取得できません。find / -ls

  • デバイスファイルの場合、デバイスのキー番号を取得できます。
  • ユーザー名またはグループ名にスペース文字が含まれている場合
  • ファイルパス(シンボリックリンクの宛先を含む)に改行文字がある場合。

さらに、これらのファイルのいくつかは仮想的かもしれません。たとえば、/proc/kcore私のシステムには、システムの仮想メモリアドレス空間である128TiBがあります。

また、見かけのサイズはディスク使用量と同じではありません。truncate -s15T fileたとえば、ディスク容量を消費しない15TiBスパースファイルを作成します。%b最も多くのディスク領域を占有するファイルを見つけるには、このオプションを使用します。

あなたが受け取る連絡先は、これらの方法によって異なります。

find / -xdev -printf '%b %p\0' 2> /dev/null |
  sort -zk1rn | head -zn1 | tr '\0' '\n'

(最も重くて語彙順で最初の場合)

または:

find / -xdev -printf '%b %p\0' 2> /dev/null|
  awk -v max=-1 -v RS='\0' '
    $1 > max {max = $1; out = $0}
    END {if (max >= 0) print out}'

(最も重さ、タイの場合はランダム)。

ディスク使用量は512バイト単位で表示されます。読み取りまたは検索権限がないディレクトリのファイルは考慮されません。

-xdev検索を1つのファイルシステム(この場合はルートファイルシステム)に制限します。

-printfこれは-zGNU拡張であることに注意してください。-v RS='\0'また、非標準です。

すべての連絡先を報告する(特定の順序なし):

find / -xdev -printf '%b %p\0' 2> /dev/null |
  awk -v max=-1 -v RS='\0' '
    $1 == max {out = out ORS $0; next}
    $1 > max {max = $1; out = $0}
    END {if (max >= 0) print out}'

おすすめ記事