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


41

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

例:

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ツールをパイプライン化することでこれを実装することはできません。どんなアイデアでもいいでしょう!



サブディレクトリのみに移動するには: for d in */ .[^.]*/; 行う... `
オリビエデュラック

回答:


54

find(ここではGNUを想定find)を使用して、ファイルサイズでファイル名を出力します。ソート。最大のものを印刷します。

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

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


bashのGNU実装でのループの使用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で開いているファイルのサイズが考慮されます。

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


おかげで、うまくいきました!私は助けに感謝します。シェルでのプログラミングに慣れようとしています。私は今あまり多くを知りませんので、そのコード行で何が起こっているのか教えてくれてありがとう。
user2419571 14

簡単な質問:好奇心から、コマンドをパイピングせずにそれを行う方法はありますか?私が見たすべての例が何らかの種類のパイピングを使用しているので、私は興味があります。
user2419571 14

2
私はそれを行う他の方法があると確信しています。UNIXの哲学は、ツールは単一の目的であり、それらを連結して、あるコマンドの出力が次のコマンドの入力に送られるようにすることです。
グレンジャックマン14

それは理にかなっている。ご協力ありがとうございます。
user2419571 14

2
@ user2419571:tail -n 1 <(sort -n <(find . -type f -printf "%s\t%p\n"));)
サイラス14


5

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

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

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


1
この答えは、その仕組みを説明することで改善できます。また、受け入れられた答えと非常によく似ています(どちらがどのように機能するかを完全には説明していません)。
ダグ

man findそしてman sort、brainzを使用してください:-)
CeDeROM

MacOSでは、サイズを正しく返すことができず、膨大な数の列が返されるため、実際には動作しません。
ソリン

3

zsh最大の通常のファイルのための:

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

(もちろんls -ld --、任意のコマンドで置き換えることができます。GNU lsまたは互換を使用する-h場合は、人間が読めるサイズのオプションも参照してください)

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

同点がある場合は、いずれかがランダムに取得されます。最初をアルファベット順にしたい場合は、追加onorder by name)を追加して、タイをアルファベット順にソートします。

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


...私はあなたがzshの給与計算にいると信じ始めます;)(それは非常によくあるでしょうか?)。zshのは...残念ながら、すべてのシステムでは使用できません
オリヴィエ・デュラック

最初の10個のファイルを取得できますか?(ループのような愚かなことをしなくても)
Wowfunhappy

1
置き換え@Wowfunhappy [1][1,10]
ステファンChazelas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.