
Ich habe den folgenden Befehl verwendet, um die zehn größten Dateien im aktuellen Verzeichnis in beliebiger Tiefe aufzulisten:
find -type f -size +10M -exec ls -gGsSh1 {} + | awk 'NR<=10 {print $0}'
(Ich verwende awk
anstelle von , head
um zu verhindern, dassFehler „Rohrbruch“wenn die Liste zu lang ist)
Es funktioniert gut, aber es ist offensichtlich schwer, sich das jedes Mal zu merken und einzugeben. Ich habe versucht, es in .bash_aliases einzufügen, aber dann funktioniert es nicht (es werden 10 leere Zeilen gedruckt).
Wenn ich less
anstelle von verwende awk
, wird die Ausgabe richtig dargestellt. Das bedeutet aber, dass die gesamte Liste der Dateien, die größer als 10 MB (mein unterer Grenzwert) sind, nach Größe sortiert angezeigt wird und nicht nur die obersten.
Was also führt awk
hier als Teil eines Alias-Befehls zu einem Choke (vorausgesetzt, das ist tatsächlich das Problem) und was kann ich tun, um es zu beheben?
Antwort1
Wenn Sie diesen Befehl als Alias verwenden, $0
ist er nicht mehr durch einfache Anführungszeichen geschützt und wird in Ihren Shell-Namen umgewandelt. Diese Befehle demonstrieren dies:
$ alias F="echo '$0'"
$ F
bash
Der Shell-Name (vermutlich bash
) ist zufällig ein nicht gesetzterawkVariablenname, was zu leeren Zeilen führt.
Eine Möglichkeit zum Schutz $0
vor Shell-Erweiterungen wäre die Verwendung von etwas wie:
alias F="find -type f -size +1k -exec ls -gGsSh1 {} + | awk 'NR<=10 {print \$0}'"
Da dies jedoch $0
nutzlos ist, können Sie es einfach aus der awk
Anweisung entfernen.
find -type f -size +10M -exec ls -gGsSh1 {} + | awk 'NR<=10 {print}'
Sie können noch weiter gehen und den gesamten Block entfernen, da das Drucken der ausgewählten Zeile awk
ohnehin das Standardverhalten ist:
find -type f -size +10M -exec ls -gGsSh1 {} + | awk 'NR<=10'
Alternativ können Sie einfach weiterarbeiten head
und die Fehlermeldung ignorieren:
find -type f -size +10M -exec ls -gGsSh1 {} + 2>&1 | head