du コマンド - 出力にファイルまたはフォルダーを表示しますか?

du コマンド - 出力にファイルまたはフォルダーを表示しますか?

コマンドを実行すると、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それ. したがって、これを および ' 機能と組み合わせて使用​​して、sortnullxargsで区切られた入力を処理できます。

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およびsortxargsASCII 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、きれいなカラー出力も得られます。

ここに画像の説明を入力してください

関連情報