2016-12-24 2 views
1

Also, ich versuche Batch-Verarbeitung für viele Dateien durchzuführen, aber ich möchte die Batch-Verarbeitung mit den kleinsten Dateien zuerst starten. Ich muss alle Dateinamen in aufsteigender Reihenfolge sortieren, sortiert nach der Dateigröße. Ich habe einige Beispiele gesehen, aber ein Problem besteht darin, dass einige der Dateinamen Leerzeichen, Bindestriche, Unterstriche und andere Sonderzeichen enthalten, so dass ich nichts finden kann, was für mich funktioniert.Listen Sie Dateinamen in der Reihenfolge der Dateigröße in BASH

Antwort

6

ls -rS wird den Trick tun. Der Mann Seite erklärt mehr: http://man7.org/linux/man-pages/man1/ls.1.html

+1

Dies wird nicht mit Dateien mit Platz zwischen ihnen umgehen, wie die Frage suggeriert. – Inian

+3

@Inian warum nicht? 'ls' wird Dateien mit Leerzeichen behandeln, Wagenrücklauf einfach perfekt; Das * einzige * Problem, das ich sehe, ist, dass das OP beabsichtigt, die Ausgabe von diesem als Eingabe für ihr Skript zu verwenden - aber Ihre Antwort bietet auch keine Lösung dafür. –

0

find . -type f -print0 | xargs -0 wc -c | sort -n

Das obige Beispiel listet die Dateien im aktuellen Verzeichnis in aufsteigender Reihenfolge der Größe. Das Argument -print0 für den Befehl find weist es an, das Zeichen null '\0' anstelle von Leerzeichen als Trennzeichen zwischen den Suchergebnissen zu verwenden. Auf der anderen Seite der Pipe bereiten die Argumente -0 den Befehl xargs vor, um dasselbe zu tun. Dies behandelt Leerraumzeichen im Dateinamen als gewöhnliche Zeichen.

+0

'finden. -type f-exec wc -c {} + | sort -n ist eine effizientere Alternative, die auch POSIX-konform ist ("print0" ist nicht). Das Problem besteht jedoch darin, dass "wc" mit mehr als einem Argument filename eine Zusammenfassungszeile in der Form " total" ausgibt, die Sie herausfiltern müssten.Beachten Sie, dass 'wc' bei einer großen Anzahl von Eingabedateien mehr als einmal aufgerufen werden kann (wenn nicht alle Dateinamen auf eine einzige Befehlszeile passen), was das Filtern der Zusammenfassungszeilen komplizierter macht, insbesondere da _files_' total' genannt werden könnte. – mklement0

1

If:

  • sind Sie nicht besorgt über die Dateinamen mit eingebetteten newlines und
  • Sie die tatsächlichen Dateigrößen nicht brauchen, sondern nur die von zugrunde liegenden Dateigröße sortiert Dateinamen,

dann sollte K. Matthews' answer für Sie arbeiten.

Andernfalls vorausgesetzt, Sie GNU Dienstprogramme haben:

find . -mindepth 1 -maxdepth 1 -type f -printf '%s\t%f\0' | 
    sort -zn -k1,1 | 
    while read -r -d '' size name; do echo "[$size] [$name]"; done 

-mindepth 1 -maxdepth 1 Grenzen Dateien passen direkt gelegen in ., ähnlich wie ls (obwohl versteckten Dateien sind immer im Lieferumfang enthalten). Überlassen Sie es Prozessdateien in dem gesamten Teilbaum .

while Die Schleife zeigt eine Möglichkeit der NUL-terminierten Ausgang von find ‚s -printf '...\0' und sort -z hergestellt weiterzuverarbeiten.
Mit awk -F'\t' -v RS='\0' ... ist ein anderer.

Beachten Sie, dass find 's -printf und sort' s -z Nicht-Standard sind, GNU-spezifische Erweiterungen, wie '\0' als RS Wert mit awk verwendet wird.

Verwandte Themen