すべてのファイルを大きいサイズから小さいサイズの順にリストしたいと思います。ファイルは特定のフォルダのどこにでも存在する可能性があります。
単に次のようなものを使用してください:
ls -lS /path/to/folder/
大文字[〜#〜] s [〜#〜]。
これにより、ファイルがサイズ順にソートされます。
こちらもご覧ください:
-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
に置き換えます。 sizeとdisk usageは同じではないことに注意してください。
検索や並べ替えなどを使用できます。
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'
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)
サイズの昇順でファイルをリストすると、次のようになります。
ls -lSr
オプションは次のとおりです。
「ファイルが特定のフォルダのどこにでも存在する可能性がある」とは、開始ディレクトリ(フォルダ)内のすべてのディレクトリ(フォルダ)を再帰的に下降することを意味します。これはfind
がやろうとしていることです:
find . -type f -exec ls -lSd {} +
これにより、現在の作業ディレクトリ(.
)内のすべてのファイルが「検索」されます。見つかったファイルごとに、ls
プロセスが実行され、見つかったオブジェクトがサイズ順にソートされます。 +
の-exec
ターミネータを使用すると、複数の引数がリストとしてls
に渡されます。ディレクトリ(フォルダー)に非常に多数のファイルが含まれている場合を除いて、1つのリスト(つまり、1つのプロセスがフォークされた)が必要であり、目的の結果が得られます。
これらを試してみてください、私にとってはうまくいきます。
$ 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
ファイルリストの逆順表示:ls -lSrh
昇順の場合:ls -lSh
しばらく前にこの程度のことを書いた。リストするファイルの数を指定する引数を渡すか、単にbig
と入力します。この場合、10になります。
big () {
NUM_FILES=10;
if [ $1 ]; then
NUM_FILES=$1;
fi;
du | sort -nr | head -n $NUM_FILES
}
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 も参照してください。
元の質問のバリエーションとして、サブディレクトリ内のファイルの累積サイズを確認する場合:
#!/bin/bash
find ${1:-.} -maxdepth 1 -type d -exec du -sm {} \; | sort -nr
サイズはメガバイトで表示されます(du -sm
のm
)。 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/debianapt install ncdu
)およびosx(brew install ncdu
)。