web-dev-qa-db-ja.com

最大のファイルを再帰的に見つける

ディレクトリ内の最大のファイルを再帰的に検索しようとしています。そのディレクトリ内にサブディレクトリがある場合、関数はそのディレクトリ内に移動し、最大のファイルが存在するかどうかを確認する必要があります。最大のファイルが見つかると、相対パス名と最大のファイルの名前とサイズが出力に表示されます。

例:

dude@Shell2 (~...assignment/solutions) % bash maxfile.sh ~/test
class/asn
dude.h.gch: 9481628

これは私が持っているものです:

#!/bin/sh
clear

recursiveS() {
    for d in *; do
        if [ -d $d ]; then
            (cd $d; echo $(pwd)/$line; du -a; recursiveS;)
        fi
    done
}
recursiveS

私はしばらくの間立ち往生しています。既存のUnixツールをパイプライン化してこれを実装することはできません。どんなアイデアでもいいです!

41
user2419571

find(ここではGNU findと仮定)を使用して、ファイルサイズのファイル名を出力します。並べ替えて、最大のものを印刷します。

find . -type f -printf "%s\t%p\n" | sort -n | tail -1

これは、ファイルパスに改行文字が含まれていないことを前提としています。


GNU bashの実装)でstatのループを使用する:

shopt -s globstar
max_s=0
for f in **; do
  if [[ -f "$f" && ! -L "$f" ]]; then
    size=$( stat -c %s -- "$f" )
    if (( size > max_s )); then
      max_s=$size
      max_f=$f
    fi
  fi
done
echo "$max_s $max_f"

これは、検索ソリューションよりも大幅に遅くなります。これは、ファイル名が改行文字で終わっておらず、隠しファイルをスキップし、隠しディレクトリに移動しないことも想定しています。

現在のディレクトリに-というファイルがある場合、stdinで開いているファイルのサイズが考慮されます。

4.3より前のバージョンのbashは、ディレクトリツリーを降りるときにシンボリックリンクをたどったことに注意してください。

57
glenn jackman

このコマンドは、定義されたサイズもリストするのに役立ちます。

find . -type f -size +100M -exec ls -lh {} \;
9

これはBSD/macOSで動作します:

find . -type f -ls | sort -k7 -r

| head -n 3を追加して、興味深いエントリの数を表示することもできます(この場合は3)。

5
CeDeROM

zshを使用して、最大の通常ファイルの場合:

ls -ld -- **/*(.DOL[1])

(もちろん、ls -ld --任意のコマンド。 GNU lsまたは互換性のあるものを使用している場合は、-hオプション人間が読めるサイズ

  • .regularファイルのみ(ディレクトリ、シンボリックリンク、デバイス、fifos ...ではない)
  • D:隠されたものを含め、隠されたディレクトリに降りる
  • OL:サイズで逆順(Length)。
  • [1]:最初の一致のみ。

同点の場合、ランダムにそれらのいずれか1つを取得します。最初をアルファベット順にしたい場合は、onorder by name)を追加して、タイをアルファベット順に並べ替えます。

ディスクの使用量ではなく、ファイルサイズが考慮されることに注意してください。

4