der Befehl :
du -sh $HOME/* | grep '[0-9]G\>' | sort -k 1rn | head -1
gibt mir:
41G /Users/user/Big folder
Wie kann ich den Pfad extrahieren, um ihn in meinem Skript wiederzuverwenden?
du -sh $HOME/* | grep '[0-9]G\>' | sort -k 1rn | head -1 | awk '{ print $2 }'
Wird ausgeben
/Users/user/Big
Das ist unbrauchbar, wenn ich nach einem Ergebnis wie diesem suche:
/Users/user/Big\ folder
Antwort1
Machen Sie sich das Leben bei der automatischen Verarbeitung nicht komplizierter, indem Sie Zahlen in unterschiedlichen Einheiten verwenden. Übergeben Sie nicht -h
an du
. Dann können Sie die Ausgabe einfach numerisch sortieren und Ihr Skript funktioniert auch dann noch, wenn Sie mehr als 1 TB in einem der Verzeichnisse haben.
du -s ~/* | sort -k 1n | tail -n1
Dies gibt immer eine Zeile aus, auch wenn das größte Unterverzeichnis weniger als 1 GB enthält. Wenn das nicht gewünscht ist, kann man die Bedingung „ist die Ausgabe leer“ durch „ist die Zahl kleiner als der Schwellenwert“ ersetzen.
Um den Verzeichnisnamen zu extrahieren, nehmen Sie die Ausgabe und entfernen Sie den Teil bis zur ersten Registerkarte.
largest_directory=$(du -s ~/* | sort -k 1n | tail -n1)
largest_directory_size_kB=${largest_directory%%$(printf '\t')*} # if you need the size
largest_directory=${largest_directory#*$(printf '\t')}
Antwort2
POSIXLY:
du -s "$HOME"/* | sort -rnk1 | LC_ALL=C sed -e "s,[^/]*\(/.*\),'\1',;q"
Ohne enthielt -h
das du
Ergebnis eine einfache Zahl für die Größe, sodass wir es problemlos ohne zusätzliches sortieren können grep
.
Indem sed
wir die Löschung erst in der ersten Zeile durchführen und dann beenden, sparen wir einen head
Aufruf.
Antwort3
Eine andere Möglichkeit, den gewünschten Pfad zu extrahieren, ist über read
den Befehl, nachdem Sie fertig sind du
, und sort-ed
sie dann an diewhile/read
du.. sort.. | while read x d; do echo "$d"; done