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

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

答え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計算されませんbzsh

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

答え4

私はこのコマンドがサイズとディレクトリパスを分離するduために使用されると思うので、いくつかの追加引数を渡すだけです。\tawk

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}'

関連情報