Extrahieren Sie einen UNIX-kompatiblen Dateipfad mit Leerzeichen aus der Befehlsausgabe

Extrahieren Sie einen UNIX-kompatiblen Dateipfad mit Leerzeichen aus der Befehlsausgabe

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 -han 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 -hdas duErgebnis eine einfache Zahl für die Größe, sodass wir es problemlos ohne zusätzliches sortieren können grep.

Indem sedwir die Löschung erst in der ersten Zeile durchführen und dann beenden, sparen wir einen headAufruf.

Antwort3

Eine andere Möglichkeit, den gewünschten Pfad zu extrahieren, ist über readden Befehl, nachdem Sie fertig sind du, und sort-edsie dann an diewhile/read

du.. sort.. | while read x d; do echo "$d"; done

verwandte Informationen