すべてのファイルをサイズ順に並べる方法


241

すべてのファイルをサイズの大きいものから小さいものの順にリストしたいと思います。ファイルは特定のフォルダーのどこにでも存在できます。



5
from man ls-S sort by file size
ctrl-alt-delor

「ファイルはこのディレクトリにある」という意味ですか、それとも「ファイルは任意のサブディレクトリにある」という意味ですか。
ctrl-alt-delor

GUIツールを使用できる/使用したい場合は、以前はKDirStatであったQDirStatをご覧ください
-RhinoDevel

回答:


290

次のようなものを使用するだけです。

ls -lS /path/to/folder/

資本金S

これはファイルをサイズでソートします。

参照:

man ls

-S     sort by file size

逆順でソートしたい場合は、-rスイッチを追加してください。

更新:

ディレクトリを除外するには(および、ファイル名またはsymlinkターゲットに改行文字が含まれていない場合):

ls -lS | grep -v '^d' 

アップデート2:

フォルダーであるシンボリックリンクがどのように表示されるかがわかりました。リンクのように、シンボリックリンクは常に文字lで始まり​​ます。

をフィルタリングするコマンドを変更します-。これにより、通常のファイルのみが残ります。

ls -lS | grep '^-'

私のシステムでは、これは通常のファイルのみを表示します。

アップデート3:

再帰を追加するには、行のソートをsortコマンドに任せ、5番目の列を使用してソートするように指示します。

ls -lR | grep '^-' | sort -k 5 -rn

-rnは、最大のファイルを最上部に取得するためのリバースと数値を意味します。このコマンドの欠点は、ファイルの完全なパスが表示されないことです。

ファイルのフルパスが必要な場合は、次のようなものを使用します。

find . -type f  -exec du -h {} + | sort -r -h

このfindコマンドは、のすべてのサブディレクトリにあるすべてのファイルを再帰的に検索し.、呼び出しdu -hディスク使用率-人間が読み取れることを意味します)してから、出力を再度ソートします。あなたの場合はfind/がsortサポートされていない-h、と交換してくださいdu -ksort -rnサイズディスク使用量は同じではないことに注意してください。


5
duファイルサイズとは異なるディスク使用量を提供します。(GNU)du -hでは、数値の並べ替えは機能しません(並べ替えには-hGNUオプションが必要です)。xargsは入力として引用される可能性のある単語のリストを想定しているため、ファイル名に空白または引用文字が含まれている場合は機能しません。
ステファンシャゼル

1
-Sはサイズの降順で表示されますが、昇順はどうですか?
デーモンゴーム

3
StéphaneChazelas@に続いて、これは私の作品:find . -type f -print0 | xargs -0 du -h | sort -rh。あなただけの、最大30個のファイルを言いたい場合:find . -type f -print0 | xargs -0 du -h | sort -rh | head -n 30
user7543

こんにちは!+ |構文を説明していただけます+ | sort -r -hか?
ビクター


25

検索や並べ替えなどを使用できます。

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

(この-lsオプションは標準ではありませんが、GNUだけでなく多くのfind実装で見つかります。GNUfindなどでls -liは、いくつかの例外を除いて似たようなものが表示されます。たとえば、ACLを持つファイルは+

GNU findおよびGNU sortを使用して、ファイル名に改行文字が含まれる場合:

find . -type f -ls -printf '\0' | sort -zk7rn | tr -d '\0'

これは、「-ls」の「グループ」列にスペースが含まれていないことを前提としています(したがって-k 7パラメーター)が、必ずしもそうではありません。
kolistivra 14年

1
単にfind ... -print0 | sort -zk7rn0?
アンドレデミランダ

10

zshおよびGNU lsの場合:

ls -ldU -- **/*(.OL)

どこに(.OL)あるグロブ修飾子は.選択するために、定期的に、ファイルのみをOL(ファイルサイズ、長さによって順序を逆にするo 、昇順ためO降順)。

(zshの古いバージョンでは、ファイルサイズが2 ^ 32を超える問題があったことに注意してください)。

一部のオペレーティングシステムでは、コマンドに渡される引数リストのサイズに制限があります。これらの場合、次のものが必要です。

autoload -U zargs
zargs ./**/*(.OL) -- ls -ldU

詳細な出力ではなくファイルのリストだけが必要な場合は、次のようにします。

print -rl -- **/*(.OL)

隠しファイル(名前がドットで始まる、.およびを除く..)を隠し、隠しディレクトリも検索する場合は、Dグロビング修飾子を追加します。

print -rl -- **/*(.DOL)

何をし.OLますか?それはコマンドの一部ですか?
alpha_989

@ alpha_989、編集を参照してください
ステファンシャゼル

説明をありがとう、Stephane ..しかし、何らかの理由で..コマンドは私のワークステーションでは動作しません..私は使用ls (GNU coreutils) 8.25していzsh 5.1.1 (x86_64-ubuntu-linux-gnu)ます。それが唯一の特定のバージョンのために働くんlszsh
alpha_989

@ alpha_989、どのように機能しませんか?それらは同じバージョンで動作し、そのコードには少なくとも15年前のバージョンでは動作しなかったものは何もありません。
ステファンシャゼラス

9

サイズの昇順でファイルをリストするには、次のようにします。

ls -lSr

オプションは次のとおりです。

  • l:長い、詳細なユーザー、グループ、その他の属性、日付などを表示します
  • S:サイズごとの注文リスト(デフォルトでは降順)
  • r:リストの順序を逆にします

回答の品質を向上させるためのオプションを説明していただけますか?
ルイFリベイロ

6

「ファイルは特定のフォルダのどこにでも存在する可能性がある」と言うことは、開始ディレクトリ(フォルダ)内のすべてのディレクトリ(フォルダ)を再帰的に下降させることを意味します。これが何findを意味するかです:

find . -type f -exec ls -lSd {} +

これにより、現在の作業ディレクトリ()内のすべてのファイルが「検索」されます.。見つかったファイルごとにls、見つかったオブジェクトをサイズ順にソートするプロセスが実行されます。の+ターミネータにより、-exec複数の引数がリストとしてに渡されlsます。ディレクトリ(フォルダ)に非常に多くのファイルが含まれている場合を除き、1つのリスト(つまり、1つのプロセスが分岐)があり、希望する結果が得られます。


1
これは、lsで-h修飾子を使用して
適切

4

ファイルリストが逆順で表示されます。 ls -lSrh

昇順の場合: ls -lSh


1
+1-人間に優しい出力に-hフラグを使用するため。
computingfreak

2

私はしばらく前にこの程度まで何かを書きました。引数を渡して、リストするファイルの数を指定するか、単に入力するだけbigで、その場合は10を取得できます。

big () { 
    NUM_FILES=10;
    if [ $1 ]; then
        NUM_FILES=$1;
    fi;
    du | sort -nr | head -n $NUM_FILES
}

2

これらを試してください、それは私のためにうまくいきます。

$ find /home/san -type f -printf '%s %p\n'| sort -nr | head -n 10

# find /root -type f -exec ls -lS {} + | head -n 10 | awk '{ print $5, $9 }'

完璧な答えではありませんが、ある程度機能します

$ ls -lS |grep  '^-' | head -n 6 

1
ファイル名にスペースが含まれていない場合、awkは正常に動作します。
Eir Nym

はい..「sed」を使用して、スペースをアンダースコアに置き換えますか?それが役立つ場合
-Sand1512

いいえ、私が使用しsed、出力をカットする
EIRニム

1

デルの答えとステファンシャゼラスのコメントに追加...

find -print0と組み合わせてxargs -0、空白/スペース/その他のサポートを追加します。

du -h | sort -rn 異なるバイトの倍数間で適切にソートされません。たとえば、128Kの後に1.1Mが表示されるのは間違っています

sort -rh (--human-numeric-sort)はそれを処理しますが、GNUのバージョンでのみ動作します。

以下のコマンドは、目的の出力を提供します。

人間が読める、GNUのソート/ Linux:

find . -type f -print0 | xargs -0 du -h | sort -rh

キロバイト単位、BSD / OSX /その他:

find . -type f -print0 | xargs -0 du -k | sort -rn

BSD / OSXについては、https: //unix.stackexchange.com/a/188375/82895も参照してください


1

元の質問のバリエーションとして、サブディレクトリ内のファイルの累積サイズを表示する場合:

#!/bin/bash
find ${1:-.} -maxdepth 1 -type d -exec du -sm {} \; | sort -nr

サイズはメガバイト単位で表示されます(min du -sm)。受け入れられるその他の値du-k、キロバイト、-gギガバイトです。-h人間が判読できる表示に使用することは、並べ替えを中断するため不可能です。

これsedMforメガバイトを追加するために使用するバージョンです。

find ${1:-.} -maxdepth 1  -type d  -exec du -sm {} \; | sort -nr | sed -E 's/^([0-9]+)/\1M/g'

表示するディレクトリは${1:-.}、最初のコマンドライン引数が使用されている場合はそれを使用し、引数なしで呼び出されている場合は現在のディレクトリを使用して設定されます。

注:これは、多くのファイルで長時間かかる場合があります。このオプション-type dは、サブディレクトリのみをリストし、現在のフォルダー内のファイルを除外します。現在のフォルダー内のファイルも表示する場合は、削除します。

注:ncdu代わりに、ほとんどのLinuxリポジトリ(ubuntu / debian apt install ncdu)およびosx(brew install ncdu)で使用可能なものを使用することをお勧めします。

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