最大のファイルまたはディレクトリを見つける


10

tmpディレクトリ内のすべてのファイルとディレクトリ(非表示のものを含む)のサイズを出力し、人間が読める形式(例:2 GB)で最大から最小までサイズ順に並べ替えるコマンドはどれですか。

出力は次のようになります。

file.mpg 2GB
file.avi 1.8GB
.backtup 1.7 GB (this is directory)

lsおよびduコマンドを使用しようとしましたが、正しいスイッチを見つけることができませんでした。

回答:


7

これは簡単な修正です。du+ sortを使用してください。これを試して:

du -smc * | sort -n

これは隠しファイルを無視しますが、それは別の簡単な修正です:

du -smc .[^.] .??* * | sort -n

これにより、上記のパターンの1つ以上がファイルと一致しない場合に警告が表示される場合があります。最初のパターンは、で.[^.]始まる2文字すべてのファイル名に一致します。2番目のパターンである..を除いて、で.??*始まる3文字以上のファイル名すべてに一致します。および*は、で始まらないすべてのファイルに一致します。ファイルシステム全体でXより大きいすべてのファイルを見つける、またはファイルシステムの増加のリストを維持するなどのより高度なリストについては、私が作成したDIYシェルスクリプトがあり、興味があれば共有できます。


ありがとうございました。あなたがとても親切になるのであれば、私はあなたのスクリプトに興味があります。
xralf

1
sort -nr最も大きな値を優先する場合に使用します。
LawrenceC

3

ファイルをの下にリストするには/tmp、サイズ順に並べ替えます。

find /tmp -type f -exec du -k {} + | sort -k1n -k2

ファイルのすぐ下/tmpにあるディレクトリとツリーをリストするには、サイズ順にソートします。

du -k /tmp/..?* /tmp/.[!.]* /tmp* 2>/dev/null | sort -k1n -k2

の下/tmpにあるすべてのファイルとディレクトリツリーをサイズ順に並べ替えるには:

du -ak /tmp | sort -k1n -k2

(3つのコマンドの違いを示す例:ファイルがある/tmp/dir/file場合、最初のコマンドリスト/tmp/dir/file、2番目のリスト/tmp/dir、および3 番目のコマンドは両方ともリストします。)

上記のすべてのコマンドは、サイズをキロバイト単位で示しています。GNU duは「人間が読める」サイズ(k、M、Gなどの乗数を使用)を出力できますが、並べ替えは別の問題です。最近の十分のGNU coreutilsの(≥7.4)はそれを行うことができます。ただ置き換えるdu -kdu -hしてsort -k1n -k2sort -k1h -k2。それ以外の場合は、サフィックス付きのサイズに変換するための粗いawkスクリプトです(切り捨て)。sort上記の出力をそれにパイプするだけです。

awk -vFS='\t' -vOFS='\t' '{
    if ($1) $1 = substr($1,1,(length($1)-1)%3+1)
                 substr("kMGTPEZY",(length($1)-1)/3+1,1);
    print}'

ありがとうございました。これらのコマンドは便利ですが、私はtmpの直下のファイルとディレクトリにのみ関心があり、サブディレクトリのファイルには関心がありません
xralf

1
@xralf:次に、2番目の形式のdu呼び出しのみを使用します。
Gilles「SO-悪をやめなさい」

見た目は良いですが、forcefsckが投稿したMBとGBの方が良い結果が得られます。
xralf

3

次のエイリアスを使用しています: alias ds='du -x --all --max-depth=1 . | sort -n'

現在のディレクトリのすべてのファイルと第1レベルのサブディレクトリのサイズを出力します。


これは素晴らしい短い解決策ですが、ディレクトリのみを出力します。
xralf

ああ、すみません、あなたは正しいです。私はファイルでこの問題に直面したことがありません。なんと、それをファイルで動作させる方法を見つけました:--all swicthを使用します。
rvs

素晴らしい正しい解決策。penguin359のサイズはMBで表示されるため、やや優れています。最善の方法はforcefsckのソリューションですが、彼のソリューションではスペースを含むディレクトリを省略しています。
xralf

1

現在のバージョンのgnu sort(および@ penguin359ファイルパターンを借用)

cd /tmp; du -sShc .[^.] .??* * | sort -h

古いバージョンの並べ替え

cd /tmp
foo=$(du -sShc .[^.] .??* *)
for u in K M G T; do
    echo "$foo" | egrep "^[0-9\.]+$u" | sort -n
done

編集:-Sパラメータを追加しduて、サブディレクトリを含めないようにしました。


tmp(サブディレクトリではなく)の直下にあるファイルとディレクトリ(内部のデータの合計サイズ)が使用するディスク領域が必要でした。私のsortコマンドには-hオプションがありません。
xralf

同じファイルパターンを選択して回答を受け入れたので、あなたが何を意味しているのかは100%わかりません。サブディレクトリを含まないように私の投稿を編集しました。実際のディスク容量ではなく見かけのサイズが必要な場合は--apparent-size、duパラメータに追加できます。
forcefsck

今ではうまくいきます。GBを検索し、次にMBを検索するだけですが、問題ありません。
xralf

単位文字の順序が間違っていたので修正しました。大から小への順序が必要な場合は、単位文字の順序を変更し、-rを追加してソートします。
forcefsck

気づいたのですが、ディレクトリのサイズ(。プレフィックスなし)を
出力

0

更新:以前のスクリプトを破棄しました。ここでは新バージョン、使用している duawk (使用前のものtreesed)は、

これは次の出力です。 dusort ~/test 1

================
dir     4.10 KiB  /home/user/test/bdir
dir     4.98 KiB  /home/user/test/Kdir
dir   104.91 MiB  /home/user/test/Mdir
dir   587.47 MiB  /home/user/test/Gdir
dir   692.39 MiB  /home/user/test
================
 f      0    Byt  /home/user/test/new file
 f     42    Byt  /home/user/test/.hi   dd     en
================

これがスクリプトです

units() { awk -v pfix="$1" \
  'BEGIN { yect=6  # Array element-count
    split("Byt KiB MiB GiB TiB PiB",lbl)
    for (i=1;i<=yect;i++) { val[i] = (2**(10*(i-1)))-1 } 
  }
  { yess=yect  # Array element-subscript
    while ( $1 < val[yess] ){ yess-- }
    num = $1 / (val[yess]+1)
    sub(/^[0-9]*\t*/,"")
    if (yess!=1) { printf "%s %8.2f %s  %s\n", pfix, num, lbl[yess], $0 }
    else        { printf "%s %5d    %s  %s\n", pfix, num, lbl[yess], $0 }
   }'
}
tdir="/tmp/$USER/$(basename $0)"
[[ ! -d "$tdir" ]] && mkdir -p "$tdir"
file="$tdir/$(date +%N)"
echo "================"
dirs="$file.dirs";   du --max-depth=$2 -b $1  >"$dirs" ; <"$dirs"  sort -n           | units "dir"
echo "================"
filz="$file.filz"; { du --max-depth=$2 -ab $1 ; cat "$dirs" ; } | sort -n | uniq -u  | units " f "
echo "================"
rm   "$file."* 
#

すべてのファイルとディレクトリのサイズを言うとき、各アイテムがディスク上で占めるスペースを意味しますか(たとえば、私のUbuntu ext4ファイルシステムでは、空のディレクトリは4kのディスクスペースを占め、4kより小さいファイルは4kを占めます) 。最小割り当てチャンクは4kです。)または、各ファイルのデータ量を意味します(例:100(バイト))。また、ディレクトリの場合、そのディレクトリのファイルデータの合計を知りたいですか。ファイルのデータのサイズが必要な場合は、それをtree行います。ディスク領域を使用したい場合は、それをdu行います(treeディレクトリを合計しません)
Peter.O

「ドゥ」私はちょうどに気づいた...より良い選択であるman duことも報告できることを、「見かけ上のファイルサイズを」 .... The apparent size of a file is the number of bytes reported by 、より一般的には通常のファイルに「トイレ-c、またはls -l --block-size=1' or STAT --format =% s '。例えば、単語を含むファイルzoo' with no newline would, of course, have an apparent size of 3.
Peter.O

tmp(サブディレクトリではなく)の直下にあるファイルとディレクトリ(内部のデータの合計サイズ)が使用するディスク領域が欲しかった
xralf

申し訳ありませんが、シェルスクリプトの段階ではまだ理解できていません。そのため、他のユーザーにそれがどれほど適切な答えであるかを判断させるようにしました。お疲れ様でした。元気になったら勉強します。
xralf

0
find /tmp -exec du {} + | sort -nr | less 

最大のファイルが最初に表示されるので、q十分な数を見るとすぐにuit できます。

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