Die Ausgabe von "find" sortieren?


77

Ich muss in der Lage sein, die Ausgabe von alphabetisch zu sortieren, findbevor ich sie an einen Befehl weitergebe. Die Eingabe | sort |zwischen hat nicht funktioniert. Was konnte ich also tun?

find folder1 folder2 -name "*.txt" -print0 | xargs -0 myCommand

Antworten:


52

Verwenden Sie findwie gewohnt und begrenzen Sie Ihre Zeilen mit NUL. GNU sortkann diese mit dem Schalter -z handhaben:

find . -print0 | sort -z | xargs -r0 yourcommand

58

Einige Versionen von sorthaben eine -zOption, die nullterminierte Datensätze zulässt.

find folder1 folder2 -name "*.txt" -print0 | sort -z | xargs -r0 myCommand

Darüber hinaus können Sie auch ein übergeordnetes Skript schreiben, um dies zu tun:

find folder1 folder2 -name "*.txt" -print0 | python -c 'import sys; sys.stdout.write("\0".join(sorted(sys.stdin.read().split("\0"))))' | xargs -r0 myCommand

Fügen Sie die -rOption hinzu, xargsum sicherzustellen, dass myCommandmit einem Argument aufgerufen wird.


Gut eins (zwei?) ... Interessanterweise werden die beiden Methoden .unterschiedlich gehandhabt ... Wenn sortes am Ende der Liste auftaucht ... wird pythones nach oben sortiert. (Vielleicht mit Python sortiert LC_COLLATE=C)
Peter.O

Es gibt auch die -t \0Option zum Sortieren (was ein -zSynonym ist)
Javier

1
Das Problem bei all diesen |sortLösungen ist, dass Sie sie nicht -execmehr verwenden können. OK, obwohl es möglich ist, Ihre Aussage umzuschreiben, -execdamit sie funktioniert xargs, lautet die Frage: Was ist mit "Mini-Skripten" ? ( sh -c ...) Ich würde das nicht als xargs
Trivialität

@syntaxerror: Welches Problem hast du bei der Verwendung von sh -c mit xargs? printf %s\\n a b c d e | xargs -n3 sh -c 'printf %s, "$@"; printf \\n' x
Roger Pate

4

Ich denke, Sie brauchen die -nFlagge für Art #

Nach Mann sortieren:

-n, --numeric-sort
    compare according to string numerical value

bearbeiten

Das print0 hat vielleicht etwas damit zu tun, ich habe es gerade getestet. Nehmen Sie das print0 heraus, Sie können die Zeichenfolge mit dem -zFlag in Sort beenden


Nun, das print0scheint ein Leerzeichen zwischen den Dateinamen zu sein, was ich leider an meinen Befehl weitergeben muss
Industrial

1

Wenn Sie GNU Parallel http://www.gnu.org/software/parallel/ installiert haben, können Sie dies tun:

find folder1 folder2 -name "*.txt" -print | 
  sort |
  parallel myCommand

Sie können GNU Parallel einfach installieren, indem Sie:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem

In den Introvideos zu GNU Parallel erfahren Sie mehr: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1


Was ist die Rechtfertigung für die Verwendung von GNU Parallel? Um es zu beschleunigen?
Peter Mortensen

Das und Sie müssen sich nicht mit \ 0 getrennten Datensätzen anlegen.
Ole Tange
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.