
コマンドを実行すると、du -ah | sort -nr
出力のどの行がファイルでどのフォルダーであるかを表示させることは可能ですか? コマンドのように、先頭にと をls -l
付けると、ファイルとフォルダーが表示されます。d
-
答え1
ある程度は可能ですが、別のコマンドの助けがなければ不可能です。具体的には、ここでは GNU awk を使用しています (これは重要なので、awk のバージョンを確認してください)。
$ du -ah | sort -nr | awk '{usage=$1; $1="";cmd="file "$0;cmd |& getline type;print usage,type ;close(cmd)}'
24K .: directory
4.0K ./testdir: directory
4.0K ./out.txt: ASCII text
4.0K ./3.txt: ASCII text
4.0K ./2.txt: ASCII text
4.0K ./1.txt: ASCII text
もちろん、このアプローチには若干の欠陥があり、スペースを含むファイル名では失敗するようです(まだ改善中です)
代わりに、find
コマンドを使用してすべてのファイルを検索し、コマンドfile
を実行しdu
てフラグを介して命令を実行することも-exec
できますが、見た目が少し醜くなります (編集履歴を参照)。ただし、find
の -printf
フラグを使用して、ファイルタイプと形式を印刷すると、%y
はるかにきれいな出力が得られます。
$ find -mindepth 1 -printf "%y\t" -exec du "{}" \; | sort -rn
f 4 ./out.txt
f 4 ./3.txt
f 4 ./2.txt
f 4 ./1.txt
f 0 ./with space.txt
d 4 ./testdir
明らかに、ここはf
通常のファイル用で、d
はディレクトリ用です。find
フラグとファイルタイプ文字の詳細については、のマニュアルを参照してください。
答え2
Sergが言うように、これだけではできdu
ません。ファイル名を安全に処理するには、ASCIIヌル文字(\0
)で区切るのが最善の方法です。du
それ. したがって、これを および ' 機能と組み合わせて使用して、sort
nullxargs
で区切られた入力を処理できます。
du -0ah |
sort -zh |
xargs -0 sh -c 'for i; do s=${i%%[[:space:]]*};f=${i#*[[:space:]]}; echo "$s" "$(ls --color -dF "$f")"; done' _
-0
、-z
および-0
オプションは、du
およびsort
にxargs
ASCII nul を区切り文字として使用するように指示します。
次に、s=${i%[[:space:]]*}
行の先頭から空白部分 (サイズ) までを取得し、f=${i#*[[:space:]]}
その他すべて (ファイル名) を取得します。その後、ls
ファイル名を装飾付きで出力します。
例:
$ du -0ah Screenshots | sort -zh | xargs -0 sh -c 'for i; do s=${i%%[[:space:]]*};f=${i#*[[:space:]]}; echo "$s" "$(ls --color -dF "$f")"; done' _
512 Screenshots/desktop.ini*
264K Screenshots/Screenshot (1).png*
269K Screenshots/
を使用したためls --color
、きれいなカラー出力も得られます。