web-dev-qa-db-ja.com

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

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

268
Joe

単に次のようなものを使用してください:

ls -lS /path/to/folder/

大文字[〜#〜] s [〜#〜]

これにより、ファイルがサイズ順にソートされます。

こちらもご覧ください:

man ls

-S     sort by file size

の順序で並べ替える場合は、-rスイッチを追加するだけです。

更新:

ディレクトリを除外するには(ファイル名やシンボリックリンクターゲットに改行文字が含まれていない場合):

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を呼び出します(つまりdisk usage -humanreadable)および次に、出力を再度ソートします。 find/sort-hをサポートしていない場合は、du -kおよびsort -rnに置き換えます。 sizedisk usageは同じではないことに注意してください。

308
delh

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

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

-lsオプションは標準ではありませんが、GNUだけでなく、多くのfind実装にあります。GNU findなどでは、ls -liにはいくつかの例外があります。たとえば、ACLを含むファイルには+マークが付けられていません)

ファイル名に改行文字が含まれる可能性がある場合、GNU findおよびGNU sortを使用します。

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

ZshとGNU ls:

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

ここで、(.OL)glob qualifier.regularを選択しますファイルのみ、OLで長さ順に逆順(ファイルサイズ、o、昇順、O、降順)。

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

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

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

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

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

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

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

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

ls -lSr

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

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

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

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

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

7
JRFerguson

これらを試してみてください、私にとってはうまくいきます。

$ 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 
4
Sand1512

ファイルリストの逆順表示:ls -lSrh

昇順の場合:ls -lSh

4
user174839

しばらく前にこの程度のことを書いた。リストするファイルの数を指定する引数を渡すか、単にbigと入力します。この場合、10になります。

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

Delhの回答とStéphaneChazelasのコメントに追加...

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

du -h | sort -rnは、異なるバイトの倍数の間で適切にソートされません。 1.1Mは128Kの後に表示されますが、これは誤りです。

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
djule5

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

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

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

メガバイトのsedを追加するためにMを使用するバージョンは次のとおりです。

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 )。

1
ccpizza