du-Befehl – ​​Datei oder Ordner in der Ausgabe anzeigen?

du-Befehl – ​​Datei oder Ordner in der Ausgabe anzeigen?

Wenn ich den Befehl ausführe, du -ah | sort -nrkann ich dann anzeigen lassen, welche Zeile in der Ausgabe eine Datei und welcher Ordner ist? So etwas wie der Befehl ls -lzeigt an, welche Datei und welcher Ordner es ist, mit dund -davor.

Antwort1

Es ist irgendwie möglich, aber nicht ohne die Hilfe eines anderen Befehls. Genauer gesagt verwenden wir hier GNU awk (das ist wichtig, also überprüfen Sie Ihre awk-Version).

$ 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

Natürlich ist dieser Ansatz nicht ganz ohne Mängel, da er bei Dateinamen mit Leerzeichen nicht zu funktionieren scheint (wir arbeiten noch an der Verbesserung).

Alternativ können wir auch findden Befehl verwenden, um alle Dateien zu finden und Befehle auszuführen, filedie duunseren Befehlen über -execdie Flagge folgen, aber das sieht etwas hässlich aus (siehe Bearbeitungsverlauf). Wir könnten jedoch finddie Flagge verwenden, um den Dateityp mit Format für eine viel schönere Ausgabe -printfzu drucken .%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

Offensichtlich fist hier für normale Dateien und dfür Verzeichnisse. findWeitere Informationen zu Flags und Dateitypbuchstaben finden Sie im Handbuch von

Antwort2

Wie Serg sagt, kann dies nicht von selbst geschehen du. Um Dateinamen sicher zu verarbeiten, ist es am besten, sie mit dem ASCII-Nullzeichen ( \0) zu trennen.duDas. Verwenden Sie dies also zusammen mit sortder xargsFähigkeit, durch Nullen begrenzte Eingaben zu verarbeiten:

du -0ah |
  sort -zh |
  xargs -0 sh -c 'for i; do s=${i%%[[:space:]]*};f=${i#*[[:space:]]}; echo "$s" "$(ls --color -dF "$f")"; done' _

Die Optionen -0, -zund -0weisen du, sortund an xargs, ASCII nul als Trennzeichen zu verwenden.

Dann s=${i%[[:space:]]*}holen wir uns den Zeilenanfang bis zum Leerzeichen (das ist die Größe) und f=${i#*[[:space:]]}alles andere (den Dateinamen). Dann können wir lsden Dateinamen mit Verzierung drucken.

Beispiel:

$ 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/

Da ich verwendet habe ls --color, erhalte ich auch eine schöne Farbausgabe:

Bildbeschreibung hier eingeben

verwandte Informationen