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

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

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

前任者:

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ツールをパイピングしてこれを達成することはできません。どんなアイデアでもいいでしょう!

ベストアンサー1

ファイル名とファイルサイズを出力するにはfind(ここではGNUと仮定)を使用してください。findタイプ。最大のものを印刷してください。

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

ファイルパスに改行文字が含まれていないとします。


bashGNU実装でループを使用する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"

これは解決策を見つけるよりはるかに遅いです。これはまた、ファイル名が改行文字で終わらず、隠されたファイルをスキップし、隠されたディレクトリが入力されないことを前提としています。

呼び出される現在のディレクトリにファイルがある場合は、-標準入力で開いているファイルのサイズが考慮されます。

4.3より前のバージョンでは、bashディレクトリツリーを下るときにシンボリックリンクに従いました。

おすすめ記事