
Wenn ich den Befehl ausführe, du -ah | sort -nr
kann ich dann anzeigen lassen, welche Zeile in der Ausgabe eine Datei und welcher Ordner ist? So etwas wie der Befehl ls -l
zeigt an, welche Datei und welcher Ordner es ist, mit d
und -
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 find
den Befehl verwenden, um alle Dateien zu finden und Befehle auszuführen, file
die du
unseren Befehlen über -exec
die Flagge folgen, aber das sieht etwas hässlich aus (siehe Bearbeitungsverlauf). Wir könnten jedoch find
die Flagge verwenden, um den Dateityp mit Format für eine viel schönere Ausgabe -printf
zu 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 f
ist hier für normale Dateien und d
für Verzeichnisse. find
Weitere 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.du
Das. Verwenden Sie dies also zusammen mit sort
der xargs
Fä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
, -z
und -0
weisen du
, sort
und 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 ls
den 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: