次のコマンドを使用して、ディレクトリとそのサイズのリストを取得し、それらを最大のものから最小のものに並べ替えることができます(この例では、わかりやすくするためにディレクトリ名を数字に変更しました)。
$: du -sk [a-z]* 2>/dev/null | sort -nr
413096 one
106572 two
97452 three
76428 four
55052 five
45068 six
33680 seven
23220 eight
17716 nine
私は、これらのディレクトリの入力を最大から最小まで要求するプログラムを書いていますが、便宜上、すべて1行で入力する必要があります。サイズなしで1行でディレクトリを最大から最小にソートできるコマンドはありますか?
出力を次のようにしたい:
one two three four five six seven eight nine
ディレクトリ名に空白が含まれていないと確信できる場合は、すべてのディレクトリ名を1行で取得するのは簡単です。
du -sk [a-z]*/ 2>/dev/null | sort -nr | awk '{printf $2" "}'
その出力をpythonプログラムでキャプチャしてリストにしたい場合。python2.7以降を使用する場合:
import subprocess
dir_list = subprocess.check_output("du -sk [a-z]*/ 2>/dev/null | sort -nr | awk '{printf $2\" \"}'", Shell=True).split()
Python2.6の場合:
import subprocess
subprocess.Popen("du -sk [a-z]*/ 2>/dev/null | sort -nr | awk '{printf $2\" \"}'", Shell=True, stdout=subprocess.PIPE).communicate()[0].split()
また、Pythonの機能を利用して、シェルによって行われる作業の量を減らし、特にawk
の必要性をなくすことができます。
subprocess.Popen("du -sk [a-z]*/ | sort -nr", Shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0].split()[1::2]
さらに進んで、du
出力を直接pythonに読み込み、サイズを整数に変換し、サイズでソートすることができます。ただし、シェルでsort -nr
を使用してこれを行う方が簡単です。
必要なサイズのディレクトリが現在のディレクトリにない場合、2つの可能性があります。
du -sk /some/path/[a-z]*/ 2>/dev/null | sort -nr | awk '{printf $2" "}'
そしてまた:
cd /some/path/ && du -sk [a-z]*/ 2>/dev/null | sort -nr | awk '{printf $2" "}'
これら2つの違いは、/some/path
が出力に含まれるかどうかです。
paste
の使用
du -sk [a-z]* 2>/dev/null | sort -nr| cut -f2- | paste -s -
zsh
には、グロビング修飾子を使用してグロブをソートする機能があります。関数を使用して独自のグロブ修飾子を定義することもできます。例えば:
zdu() REPLY=$(du -s -- "$REPLY")
print -r -- [[:alpha:]]*(/nO+zdu)
名前が文字で始まるディレクトリ(/
)を出力します(btw、[a-z]
はCロケールでのみ意味があります)数値的に(n)zdu
を使用して逆ソート(O)関数。
あなたが行うときは注意してください:
du -s a b
a
とb
に同じファイルへのハードリンクが含まれている場合、それらのディスク使用量はa
ではカウントされますが、b
ではカウントされません。ここでのzsh
アプローチはそれを回避します。
Pythonを使用する場合も、そこから同じことを行います。各ファイルに対してdu -s
を呼び出し、そのリストをそこで並べ替えます。ファイル名には、スペース、タブ、改行を含む任意の文字を含めることができることに注意してください。
または多分このようなもの
du -sk [a-z]* 2>/dev/null | sort -nr | awk '{print $2}' | sed ':a;N;$!ba;s/\n/ /g'
これにより、すべてが1行で表示されます。
du
コマンドは\t
は、サイズとディレクトリパスを分離するため、awk
に追加のパラメーターを渡すだけで済みます。
du -sk [a-z]* 2>/dev/null | sort -nr | awk -F'\t' -v ORS=" " '{print $2}'
まれに、ディレクトリパスにタブ文字も含まれている場合は、最初にサイズプレフィックスを削除できます。
du -sk [a-z]* 2>/dev/null | sort -nr | awk -v ORS=" " '{sub(/^[0-9]*\t/,"");print}'
この問題を解決する方法はたくさんありますが、これで解決しました
du --max-depth=1 . | sort -n | awk '{system("du -h --max-depth=0 "$2);}'
du --max-depth=1 .
は、直接バイト数を提供します。sort-nは数値でソートし、ソートの結果を目で覚めて人間が読める値を提供します。
私が使用した場合du -h --max-depth=1 .
最初のコマンドとして、数値によるソートは誤ってソートされます。これは、2.2Gが3.3Mよりも数値的に小さいため、ソートは人間の読み取り可能な単位を認識しないためです。