hek2mgl's answer erklärt das Problem gut und seine Lösung funktioniert gut; Diese Antwort betrachtet Leistung.
Die akzeptierte Antwort ist ein bisschen langsam, weil es einen bash
Prozess für jede Eingabezeile erstellt.
Während xargs
ist im allgemeinen vorzuziehen, und schneller als ein muschelCodeSchleife, in diesem speziellen Fall die Rollen umgekehrt sind, weil Shell-Funktionalität in jeder Iteration benötigt wird.
Die folgende alternative Lösung verwendet eine while
Schleife die Eingangsleitungen zu verarbeiten, und auf meiner Maschine, ist etwa doppelt so schnell als xargs
Lösung.
find . -printf "%P\n" | sort | while IFS= read -r f; do echo "$(uuid) $f"; done
Wenn Sie Dateinamen mit eingebetteten Zeilenumbrüche betroffen sind (sehr selten) und verwenden GNU Dienstprogramme, könnten Sie NUL Bytes als Trennzeichen verwenden:
find . -printf "%P\0" | sort -z | while IFS= read -d '' -r f; do echo "$(uuid) $f"; done
aktualisieren: Die schnellste Ansatz ist eine Shell-Schleife überhaupt nicht zu verwenden, wie durch ᴳᵁᴵᴰᴼ's clever answer. Siehe unten für eine portable Version seiner Antwort.
Hinweis zur Kompatibilität:
Die find
des OP-Befehl die Verwendung von impliziert GNUfind
(Linux) und nutzt Funktionen (-printf
), die nicht auf anderen Plattformen arbeiten können.
Hier ist eine portable Version von ᴳᵁᴵᴰᴼ's answer, die nur POSIX-kompatible Funktionen von find
(und awk
) verwendet.
Beachten Sie jedoch, dass uuid
kein POSIX-Dienstprogramm ist; da Linux und BSD-ähnliche Systeme (einschließlich OSX) einen uuidgen
Dienstprogramm haben, verwendet der Befehl, dass statt:
find . -exec printf '%s\t' {} \; -exec uuidgen \; |
awk -F '\t' '{ sub(/.+\//,"", $1); print $2, $1 }' | sort -k2
@TomFenech: '-n 1 'würde von jedem Leerzeichen tatsächlich geteilt, ob Line-Interieur oder nicht, also würde der Befehl mit Pfaden mit eingebetteten Leerzeichen brechen; "-L 1" kommt der Absicht näher, indem es eine zeilenweise Verarbeitung durchführt, aber Worttrennung wird immer noch auf jede Zeile angewendet, so dass potentiell _ multiple_ Argumente pro Eingang an echo übergeben werden oder möglicherweise keine Probleme verursachen). Der robuste Ansatz ist die Verwendung von "-I", wie in der akzeptierten Antwort. – mklement0