Dadurch erhalte ich eine Liste mit den Pfaden zu allen Textdateien:
find / -type f -name '*.txt' > ~/Desktop/sorted.txt
Ich möchte diese Pfadliste nach der Dateigröße jedes Elements sortieren, bin mir aber nicht sicher, was ich verwenden soll. Das funktioniert nicht wie erwartet:
find / -type f -name '*.txt' |sort -S > ~/Desktop/sorted.txt
Irgendwelche Vorschläge?
Antwort1
Dieser Befehl verwendet wc
für jede passende Datei einen separaten Prozess, daher kann die Leistung beeinträchtigt sein. Ich habe ihn im Hinblick auf Kompatibilität und POSIX-Konformität erstellt.
find / -type f -name '*.txt' -exec wc -c {} \; | sort -t ' ' -n -k 1,1 | cut -d ' ' -f 2-
Jeder wc -c
erzeugt eine Zeile in einem Formular
12345 /path/to/file/possibly with spaces/foo.txt
wobei das erste Leerzeichen die Byteanzahl vom Pfad trennt. sort
ruft alle Zeilen ab, verwendet das Leerzeichen als Feldtrennzeichen und sortiert numerisch nach dem ersten Feld, also nach der Byteanzahl. cut
Verwendet dann das Leerzeichen als Feldtrennzeichen und druckt aus dem zweiten Feld, also alles außer dem ersten Feld, also alles außer der Byteanzahl, also die Pfade.
Die Lösung kann leicht angepasst werden, um nach Zeilenanzahl zu sortieren: Verwenden Sie einfach wc -l
anstelle von wc -c
.
Hinweis:
Ein Pfad, der ein oder mehrere Zeilenumbruchzeichen enthält, beschädigt meinen Code. Um den Code dagegen immun zu machen, könnte man Tools verwenden, die Nullzeichen als Trennzeichen unterstützen. Mit POSIX-Tools ist dies schwierig, wenn überhaupt möglich. Diese Antwort konzentriert sich auf die Portabilität, daher sind hoffentlich alle Pfade zu Ihren Textdateien „nett“.
Antwort2
Sie können immer den (wahrscheinlich nicht optimalen) Ansatz wählen, Tools miteinander zu verketten:
find / -type f -name '*.txt' -ls | sort -nk7,7 | awk '{print $NF;}'
- Der
-ls
Schalter bei der Suche zeigt eine Reihe zusätzlicher Spalten an, einschließlich der Dateigröße (beim GNU-Toolset die 7. Spalte, kann unter MacOS anders sein). - Es
sort
wird eine numerische Sortierung in der 7. Spalte (Dateigröße) durchgeführt. - Das
awk
entfernt alle anderen Felder und druckt nur den Dateinamen