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
Industrie
quelle

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
Oli
quelle
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.

Arcege
quelle
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

Wer bin ich
quelle
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

Ole Tange
quelle
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