web-dev-qa-db-ja.com

1行で最大から最小までのサイズに基づいてディレクトリを一覧表示する

次のコマンドを使用して、ディレクトリとそのサイズのリストを取得し、それらを最大のものから最小のものに並べ替えることができます(この例では、わかりやすくするためにディレクトリ名を数字に変更しました)。

$: 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
6
etho201

ディレクトリ名に空白が含まれていないと確信できる場合は、すべてのディレクトリ名を1行で取得するのは簡単です。

du -sk [a-z]*/ 2>/dev/null | sort -nr | awk '{printf $2" "}'

情報をPythonに取り込む

その出力を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が出力に含まれるかどうかです。

3
John1024

pasteの使用

du -sk [a-z]* 2>/dev/null | sort -nr| cut -f2- | paste -s -
3
iruvar

zshには、グロビング修飾子を使用してグロブをソートする機能があります。関数を使用して独自のグロブ修飾子を定義することもできます。例えば:

zdu() REPLY=$(du -s -- "$REPLY")

print -r -- [[:alpha:]]*(/nO+zdu)

名前が文字で始まるディレクトリ(/)を出力します(btw、[a-z]はCロケールでのみ意味があります)数値的に(n)zduを使用して逆ソート(O)関数。

あなたが行うときは注意してください:

du -s a b

abに同じファイルへのハードリンクが含まれている場合、それらのディスク使用量はaではカウントされますが、bではカウントされません。ここでのzshアプローチはそれを回避します。

Pythonを使用する場合も、そこから同じことを行います。各ファイルに対してdu -sを呼び出し、そのリストをそこで並べ替えます。ファイル名には、スペース、タブ、改行を含む任意の文字を含めることができることに注意してください。

2

または多分このようなもの

du -sk [a-z]* 2>/dev/null | sort -nr | awk '{print $2}' | sed ':a;N;$!ba;s/\n/ /g'

これにより、すべてが1行で表示されます。

0
Neven

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}'
0
h.j.k.

この問題を解決する方法はたくさんありますが、これで解決しました

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よりも数値的に小さいため、ソートは人間の読み取り可能な単位を認識しないためです。

0
thefearlessdog