次のコマンドを使用して、ディレクトリリストとそのサイズを取得し、それらを最大から最小の順に並べ替えることができます(この例では、わかりやすくするためにディレクトリ名を数字に変更しました)。
$: 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
ディレクトリ名にスペースが含まれていないと確信している場合は、すべてのディレクトリ名を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
出力に含まれるかどうかです。
答え2
使用paste
du -sk [a-z]* 2>/dev/null | sort -nr| cut -f2- | paste -s -
答え3
zsh
ワイルドカード修飾子を使用してワイルドカードをソートする機能。関数を使用して独自のグローバル修飾子を定義することもできます。たとえば、
zdu() REPLY=$(du -s -- "$REPLY")
print -r -- [[:alpha:]]*(/nO+zdu)
/
[a-z]
この関数は、名前が文字()で始まるディレクトリを数値(n)の逆順(O)で印刷するために使用されます(Cロケールでのみ意味があります)zdu
。
これを行うときは、次の点に注意してください。
du -s a b
a
同じファイルへのハードリンクが含まれている場合、ディスク使用量はb
計算されますがa
計算されませんb
。zsh
Pythonを使用している場合は、そこで同じことを行います。du -s
つまり、各ファイルを呼び出してリストを並べ替えます。ファイル名には、スペース、タブ、改行を含む任意の文字を含めることができます。
答え4
私はこのコマンドがサイズとディレクトリパスを分離する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}'