tmpディレクトリ内のすべてのファイルとディレクトリ(隠しファイルとディレクトリを含む)のサイズを印刷し、人間が読める形式(たとえば2GB)で最大から小さいものまでサイズでソートするコマンドは何ですか?
出力は次のようになります。
file.mpg 2GB
file.avi 1.8GB
.backtup 1.7 GB (this is directory)
ls
とコマンドを試しましたが、du
正しいスイッチが見つかりませんでした。
答え1
以下は簡単な修正方法です。 du + sortを使用してください。この試み:
du -smc * | sort -n
これにより隠されたファイルは無視されますが、ここに別の簡単な修正方法があります。
du -smc .[^.] .??* * | sort -n
上記のパターンの1つ以上がファイルと一致しない場合、警告が発生する可能性があります。最初のパターンは 。.[^.]
で始まるすべての2文字のファイル名と一致します。 2番目のパターンは、..を除いて...??*
で始まる3文字以上のすべてのファイル名と一致します。 *で終わらないすべてのファイルと一致します。
答え2
以下の場所にあるファイルをサイズ/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つのコマンドの違いの例:fileがある場合、/tmp/dir/file
最初のコマンドはをリストし/tmp/dir/file
、2番目のコマンドはをリストし/tmp/dir
、3番目のコマンドは両方をリストします。)
上記のすべてのコマンドは、サイズをキロバイト単位で表示します。 GNU duは「人間が読める」サイズ(k、M、Gなどの乗数を使用)を出力できますが、それを並べ替えることは別の問題です。十分な最新のGNU coreutils(≥7.4)がこれを行うことができます。ちょうどanddu -k
に置き換えてください。そうでない場合は、サフィックスサイズ(下降)に変換するためのおおよそのawkスクリプトがあります。上記の出力をここにパイプするだけです。du -h
sort -k1n -k2
sort -k1h -k2
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}'
答え3
私は次のエイリアスを使用します。alias ds='du -x --all --max-depth=1 . | sort -n'
現在のディレクトリと最初のレベルのサブディレクトリにあるすべてのファイルのサイズを印刷します。
答え4
修正する:以前のスクリプトを破棄しました。これはdu
およびを使用する新しいバージョンです
awk
(以前のバージョンではtree
およびを使用sed
)。
これは次の出力です。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."*
#