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

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

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

前任者:

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ディレクトリツリーを下るときにシンボリックリンクに従いました。

答え2

このコマンドは、定義されたサイズを一覧表示するのにも役立ちます。

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

答え3

これはBSD / macOSで動作し、高速ですがPOSIXではなくユーティリティ-ls拡張を使用しますfind

find . -type f -ls | sort -k7 -r | head -n 3

速度は遅いが-ls拡張機能は利用できないPOSIXシステムで動作しますfind

find . -type f -exec ls -al {} \; | sort -k5 -r | head -n3

仕組み:

  • find以下に説明する特定のクエリに基づいて結果を表示する強力なファイル検索ユーティリティ。
  • find .現在の作業ディレクトリから検索します。
  • find . -type f指定されたファイル形式「f」のみが検索されます。つまり、通常のファイルです(ディレクトリ、特殊ファイル、リンク、ソケットなどをスキップします)。
  • -lsスイッチは、find見つかったファイルに関する完全な情報を表示するように表示されます。ただし、BSDシステムの担当者によると、これはIEEE Std 1003.1-2001(「POSIX.1」)規格の拡張であり、すべてのプラットフォームで機能しない可能性があります。
  • または、-lsシステムで拡張機能が利用できない場合は、コマンドを-exec .. {} \;使用して5番目のフィールドを使用して結果を並べ替えることができます。見つかったファイル名を示します。コマンドが含まれています。ls -al{}\;-exec
  • |Unix 記号は、あるプログラムの出力を別のプログラムの入力にリダイレクトする「パイプ」を意味します。findプログラム出力テキストをsortプログラムへの入力として送信します。
  • sortソートユーティリティです。データ行を取得し、結果に従って行を昇順に並べ替えます。
  • sort -k77番目のフィールドがソートパラメータ値として使用されることを示します。パラメータはスペースで区切ります。 7番目のパラメーターは、ユーティリティーによって生成されたファイルのサイズですfind-exec ls -al {} \;代わりに使用する場合は、-ls5番目のフィールドを使用して-k5ソートされます。
  • -rsort最大のものを最初に配置し、逆アライメントを使用するように指示します。なぜなら、私たちは最初に最大のファイルを見たいからです。
  • また、何百行も実際に表示したくない場合は、ソートされた|出力をhead指示に従って結果出力の最初の3行だけを表示するユーティリティにパイプすることもできます。-n 3

簡単に言うと、通常のファイルを再帰的に見つけるために使用されます。現在の作業ディレクトリでのみ検索を開始し、拡張子(または実行)を使用してfindファイルに関する完全な情報を表示します。後でUnixパイプを使用して結果をに渡し、最初に7番目(または5番目)のフィールドに基づいて最大値にソートします。ユーティリティを使用して結果を行に制限することもできます。-lsls -alfindsort|nhead

「Brainzを使う」とは、「人」を読み、オフラインで直接ソリューションを検索できるようにして、最初から問題を解決するように訓練することです。 :-)

答え4

またスティーブン・チャジェラス'返信、次のメモを追加したい(コメントできません):

  1. 最小の一般ファイルを取得するには、o代わりに次のように使用しますO
ls -ld -- **/*(.DoL[1])
  1. ワイルドカードに特定の拡張子を追加してフィルタリングできます**/*
ls -ld -- **/*.png(.DoL[1])
ls -ld -- **/*.{png, jpg}(.DoL[1]) # this will give two results, one per extension

関連情報