ディレクトリとそのサブディレクトリで最大のファイルを見つける方法は?


102

UNIXクラスを始めたばかりで、さまざまなBashコマンドを学習しています。私たちの割り当てには、その下に多数のフォルダがあるディレクトリでさまざまなコマンドを実行することも含まれます。

私はルートフォルダからすべての通常のファイルをリストして数える方法を知っています:

find . -type l | wc -l

しかし、私はディレクトリ全体で最大のファイルを見つけるためにそこからどこへ行くべきかを知りたいのです。duコマンドに関して何かを見たことがありますが、それはまだわかっていません。そのため、学んだことのレパートリーでは、なんとかしてls -tコマンドにコマンドを接続する必要があると思います。

そして、私の 'lingo'が正しくない場合、私はまだそれに慣れています!


2
コマンドを知っていても、その使用方法がわからないman場合は、入力してから、目的のコマンドを入力してみてください。Upを押すqと、そのコマンドの適切な手動エントリが表示されます(押してコマンドラインに戻ります)。
砂丘2012

回答:


126

このリンクからの引用

特定のディレクトリとそのサブディレクトリ内の上位10個の最大ファイル名(ディレクトリではない)を検索して印刷する場合

$ find . -printf '%s %p\n'|sort -nr|head

検索を現在のディレクトリに制限するには、「-maxdepth 1」をfindで使用します。

$ find . -maxdepth 1 -printf '%s %p\n'|sort -nr|head

そして、トップ10の最大の「ファイルとディレクトリ」を印刷するには:

$ du -a . | sort -nr | head

**上記の唯一の「head」の代わりに「head -n X」を使用して、上位X個の最大ファイルを印刷します(上記のすべての例で)


1
「du -a。| sort -nr | head」が実際のファイルサイズの2倍のKB数を返すのはなぜですか?
xxjjnn 2013年

6
ああ、「k」オプションを追加する必要があります。そうしないと、1024ではなく512バイトの倍数が表示されます。du -ak
xxjjnn

2
1つ目は、人間が読める形式でサイズを取得する方法を教えてください。
Bluz

私は交換してみたい@Bluz '%s %p\n''%p\n'し、追加|xargs ls -lhの端に
ダンカンXシンプソン

6
最初のソリューションはOS Xでは機能しなかったため、簡単なハックを使用して3番目のソリューションからディレクトリをフィルターで除外しましたdu -am . | sort -nr | grep '\..*\.' | headmメガバイト単位で表示ファイルサイズであり、そして使用されるgrep少なくとも2個のドットを含む行を示すために、最初はである./パスでは、第2のファイル拡張子、例えばです.mov
psmith

63

現在のディレクトリとそのサブディレクトリで上位25個のファイルを見つけるには、次のようにします。

find . -type f -exec ls -al {} \; | sort -nr -k5 | head -n 25

これにより、 "sort -nr -k5"パイプコマンドを使用してファイルのサイズに基づいてソートすることにより、上位25ファイルが出力されます。

同じですが、人間が読めるファイルサイズです。

find . -type f -exec ls -alh {} \; | sort -hr -k5 | head -n 25


10
find . -type f | xargs ls -lS | head -n 1

出力

-rw-r--r--  1 nneonneo  staff  9274991 Apr 11 02:29 ./devel/misc/test.out

ファイル名だけが必要な場合:

find . -type f | xargs ls -1S | head -n 1

これにより、使用が回避さawkれ、必要なフラグをで使用できるようになりますls

警告。はxargs長いコマンドラインの作成を回避しようとするため、多くのファイルを含むディレクトリで実行すると、最終ls的に複数回実行されるため、失敗する可能性があります。これは乗り越えられない問題ではありません(head -n 1ls呼び出しから出力を収集しls -S、単一のファイルができるまでループして再度実行できます)が、このアプローチは多少損なわれます。


すみませんxargs、あなたを無視してしまった+1
Steve

2
スペースを含むファイル名を処理するには、次を使用しますfind . -type f -print0 | xargs -0 ls -lS | head -n 1
rymo

これにより、xargs実行された最初のバッチでのみ最大のファイルが見つかります。修正するには、並べ替えを追加しますfind . -type f -print0 | xargs -0 ls -lS | sort -rk 5 | head -n 10。私のためにOSXで働いた。
psmith

10

Linux / UNIX / BSDファイルシステム上の最大のファイル/ディレクトリを見つけるために利用できる単純なコマンドはありません。ただし、次の3つのコマンド(パイプを使用)を組み合わせると、最大のファイルのリストを簡単に見つけることができます。

# du -a /var | sort -n -r | head -n 10

より人間が読みやすい出力が必要な場合は、以下を試してください。

$ cd /path/to/some/var
$ du -hsx * | sort -rh | head -10

どこ、

  • Varは、検索するディレクトリです。
  • duコマンド-hオプション:人間が読める形式(1K、234M、2Gなど)でサイズを表示します
  • duコマンド-sオプション:各引数の合計のみを表示します(概要)。
  • duコマンド-xオプション:異なるファイルシステム上のディレクトリをスキップします。
  • sortコマンド-rオプション:比較結果を逆にします
  • sortコマンド-hオプション:人間が読み取れる数値を比較します。これは、GNUソート固有のオプションのみです。
  • headコマンド-10または-n 10オプション:最初の10行を表示します。

私は2番目のコマンドの方が好きですが、osxでは、ソートバージョンの-hオプションがインストールされていません。Macの場合:du -hsx * | 並べ替え-rn | ヘッド-10
Yann VR

1
その2番目のコマンドを愛する!私が試したすべての中で最高-後で使用するために保存します。
CodeMouse92

明らかに詳しく+1でコマンドを説明
ハリッシュ

8

これは、ファイルが通常のファイルである場合は再帰的にリストし、7番目のフィールド(find出力のサイズです。あなたのフィールドを確認してください)で並べ替え、最初のファイルのみを表示します。

find . -type f -ls | sort +7 | head -1

の最初のオプションfindは、再帰検索の開始パスです。f通常のファイルを検索するタイプ。これをファイル名として解析しようとすると、ファイル名にスペース、改行、その他の特殊文字が含まれていると失敗する可能性があることに注意してください。オプションsortもオペレーティングシステムによって異なります。FreeBSDを使用しています。

「より良い」が、より複雑で重いソリューションはfind、ディレクトリをトラバースするstatことですが、おそらくファイルの詳細を取得awkするために使用してから、おそらく最大サイズを見つけるために使用します。の出力statもオペレーティングシステムによって異なることに注意してください。


1
+7argは何をするつもりですか?私のマシンでは、sortはと呼ばれるファイルが見つからないと不平を言っています+7
砂丘

@砂丘-私が言ったように、sortあなたのシステムのマニュアルページをチェックしてください。 私はFreeBSDの並べ替えからどこの利用導出し、現時点ではOS X 10.4を使用していますsort [-cmus] [-t separator] [-o output-file] [-T tempdir] [-bdfiMnr] [+POS1 [-POS2]] [-k POS1[,POS2]] [file...]...注意してください+POS [-POS2]。これは現在のバージョンのFreeBSDでも動作します。
ghoti 2012

2
別の並べ替えプログラムがあるようです。これは私のソートプログラムのmanページです-linux.die.net/man/1/sortこれが私のマシンで動作するには、-karg を明示的に使用する必要があります。sort -k 7。編集:OSX 10.5までに、ソートのmanページが私のバージョンに変更されたようです。
砂丘2012

1
@デューンズ-それはすべてGNUソートですが、バージョンが異なります。[+POS1] [-POS2]表記は、単に古いものです。私の知る限り、この表記は現在のGNUソートで引き続きサポートされていますが、今のところ、バージョン5.1前後でソートのmanページから削除されているようです。FreeBSD 4.11のソートのmanページで確認できます。FreeBSD 5.0がリリースされる前から、sortのmanページを読んだことがないと思います!
ghoti 2012

また、+POS1ソートパラメータは0 -k POS1から数えますが、1から数えます。
ghoti 2012

6

これにより、現在の作業ディレクトリで最大のファイルまたはフォルダーが見つかります。

ls -S /path/to/folder | head -1

すべてのサブディレクトリで最大のファイルを見つけるには:

find /path/to/folder -type f -exec ls -s {} \; | sort -nr | awk 'NR==1 { $1=""; sub(/^ /, ""); print }'

lsのデフォルトの動作はファイルを列にリストすること(つまり、1行に複数のエントリ)であるため、最初のファイルは最大のファイルだけを正確に見つけることはできません。2番目のコマンドに関しては、指定されたディレクトリで最大のファイルのみが見つかり、そのサブディレクトリは見つかりませんでした。
砂丘

@砂丘:あなたは正しいです。最初のコマンドディレクトリを見つけることができますが、のデフォルトの動作が原因ではありませんls。私のテストでは、-Sフラグは1行に1つのファイルをリストします。2番目のコマンドを修正しました。うまくいけば、今それは完全な証拠です。ありがとうございました。
Steve

4

Solarisでは、次のものを使用します。

find . -type f -ls|sort -nr -k7|awk 'NR==1{print $7,$11}' #formatted

または

find . -type f -ls | sort -nrk7 | head -1 #unformatted

ここに投稿された他のものが機能しなかったためです。これにより$PWD、サブディレクトリで最大のファイルが検索されます。


2

次のワンライナーを試してください(上位20件の最大ファイルを表示)。

ls -1Rs | sed -e "s/^ *//" | grep "^[0-9]" | sort -nr | head -n20

または(人間が読めるサイズ):

ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20

Linux / BSD / OSXでは他の回答と比較し-printfて問題なく動作します。find のオプションはOSX / BSDには存在せずstat、OSによってパラメーターが異なるためです。ただし、OSX / BSDで適切に機能する2番目のコマンド(sortがない場合-h)からインストールsortするcoreutilsか、削除-hlssort -nr代わりに使用します。

したがって、これらのエイリアスはrcファイルに含めると便利です。

alias big='du -ah . | sort -rh | head -20'
alias big-files='ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20'

これはパスなしのファイル名のみを表示するため、実際に最大のファイルを見つけるのに役立ちません。
psmith

私にとって一番上にあるのは本当に最大のファイルですが、最後には正しいファイルが得られません
Borislav Markov

2

次のコマンドを試してください:

find /your/path -printf "%k %p\n" | sort -g -k 1,1 | awk '{if($1 > 500000) print $1/1024 "MB" " " $2 }' |tail -n 1 

これにより、最大のファイル名とサイズ、および500M以上が印刷されます。を移動するif($1 > 500000)と、ディレクトリ内の最大のファイルが印刷されます。



0

このスクリプトにより、今後のアクションのために最大のファイルを簡単に見つけることができます。私はそれを〜/ binディレクトリに保存し、〜/ binを$ PATHに入れます。

#!/usr/bin/env bash
# scriptname: above
# author: Jonathan D. Lettvin, 201401220235

# This finds files of size >= $1 (format ${count}[K|M|G|T], default 10G)
# using a reliable version-independent bash hash to relax find's -size syntax.
# Specifying size using 'T' for Terabytes is supported.
# Output size has units (K|M|G|T) in the left hand output column.

# Example:
#   ubuntu12.04$ above 1T
#   128T /proc/core

# http://stackoverflow.com/questions/1494178/how-to-define-hash-tables-in-bash
# Inspiration for hasch: thanks Adam Katz, Oct 18 2012 00:39
function hasch() { local hasch=`echo "$1" | cksum`; echo "${hasch//[!0-9]}"; }
function usage() { echo "Usage: $0 [{count}{k|K|m|M|g|G|t|T}"; exit 1; }
function arg1() {
    # Translate single arg (if present) into format usable by find.
    count=10; units=G;  # Default find -size argument to 10G.
    size=${count}${units}
    if [ -n "$1" ]; then
        for P in TT tT GG gG MM mM Kk kk; do xlat[`hasch ${P:0:1}`]="${P:1:1}"; done
        units=${xlat[`hasch ${1:(-1)}`]}; count=${1:0:(-1)}
        test -n "$units" || usage
        test -x $(echo "$count" | sed s/[0-9]//g) || usage
        if [ "$units" == "T" ]; then units="G"; let count=$count*1024; fi
        size=${count}${units}
    fi
}
function main() {
    sudo \
        find / -type f -size +$size -exec ls -lh {} \; 2>/dev/null | \
        awk '{ N=$5; fn=$9; for(i=10;i<=NF;i++){fn=fn" "$i};print N " " fn }'
}

arg1 $1
main $size

0

それはそれを行う非常に簡単な方法です:

ls -l | tr -s " " " " | cut -d " " -f 5,9 | sort -n -r | head -n 1***

そしてあなたはこれを得るでしょう: 8445 examples.desktop


1***最後に何をすることになっていますか?その引数に対して「一致が見つかりません」というエラーが表示されます。
user4815162342 2016年

0

Linuxソリューション:たとえば、ホーム(/)ディレクトリのすべてのファイル/フォルダリストをファイル/フォルダサイズ(降順)で表示するとします。

sudo du -xm / | 並べ替え-rn | もっと


0

フォルダー内の大きいファイルを一覧表示するには

ls -sh /pathFolder | sort -rh | head -n 1

出力は、ls -sh大きさでs、人間hのファイルサイズの数の分かりやすい表示。

使用できますls -shS /pathFolder | head -n 1。大きなSからlsすでに小さいものが、最初の結果、そのフォルダ内のすべてのファイルのその合計に大きなファイルからリストを注文します。したがって、より大きなファイル、つまり1つのファイルをリストするだけのhead -n 2場合は、「2行目の結果」を確認するか、最初の例をで使用する必要がありますls sort head


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.