Zu viele dieser Antworten verwenden die Shell-Erweiterung, um die Ergebnisse eines Suchvorgangs zu speichern. Das sollten Sie nicht leichtfertig tun.
Sagen wir, ich habe 30.000 Songs, und die Titel dieser Songs haben ungefähr 30 Charaktere. Kommen wir jetzt nicht einmal in das white space Problem.
Mein Fund wird über 1.000.000 Zeichen zurückgeben, und es ist sehr wahrscheinlich, dass mein Befehlszeilenpuffer nicht so groß ist. Wenn ich so etwas mache:
%Vor% Das Problem (abgesehen von dem Leerraum in Dateinamen) ist, dass Ihr Kommandozeilenpuffer einfach den Überlauf von find
fallen lässt. Es kann sogar absolut still scheitern.
Aus diesem Grund wurde der Befehl xargs
erstellt. Es stellt sicher, dass der Befehlszeilenpuffer nie überläuft. Es wird so oft wie nötig den Befehl ausführen, der dem xargs
folgt, um den Befehlszeilenpuffer zu schützen:
Natürlich wird die Verwendung von xargs
auf weißem Weg immer noch ersticken, aber moderne Implementierungen von xargs
und find
haben eine Möglichkeit, dieses Problem zu lösen:
Wenn Sie garantieren können, dass Dateinamen keine Tabs oder \n
(oder doppelte Leerzeichen) enthalten, ist es besser, einen Fund in eine while-Schleife zu leiten:
Die Pipeline sendet die Dateien an while read
, bevor der Befehlszeilenpuffer voll ist. Noch besser, das read file
liest eine ganze Zeile ein und fügt alle in dieser Zeile gefundenen Elemente in $file
ein. Es ist nicht perfekt, weil die read
immer noch auf Leerraum bricht, also Dateinamen wie:
Scheitert immer noch. Die Variable $file
aill sieht sie als:
Um dieses Problem zu umgehen, müssen Sie find ... -print0
verwenden, um Nullen als Eingabe-Teiler zu verwenden. Ändern Sie dann IFS
, um Nullen zu verwenden, oder verwenden Sie den Parameter -d%code%
in der while read-Anweisung in der BASH-Shell.
Es gibt viele Möglichkeiten, diese Katze zu häuten. Ich würde selbst einen Aufruf zum Suchbefehl verwenden:
%Vor% Wenn Sie Leerzeichen in Ihren Dateinamen haben, ist es am besten, die Option -print0
zu verwenden; Ein möglicher Weg ist dies:
Alternativ können Sie IFS
speichern und wiederherstellen. Danke an David W.'s Kommentare und insbesondere dafür, dass die while
loop-Version auch den Vorteil hat, dass sie sehr viele Dateien korrekt verarbeiten kann, während die erste Version, die $(find)
in ein erweitert for-loop funktioniert irgendwann nicht mehr, da die Shell-Erweiterung Grenzen hat.
Die Zeichenfolge {}
wird durch den aktuellen Dateinamen ersetzt, der überall dort verarbeitet wird, wo er in den Argumenten des Befehls auftritt, nicht nur in Argumenten, in denen er allein ist, wie in einigen Versionen von find.
Bitte überprüfen Sie den Mann für weitere Informationen Ссылка
Dies funktioniert mit den meisten Dateinamen (einschließlich Leerzeichen), aber nicht mit Zeilenumbrüchen, Tabulatoren oder doppelten Leerzeichen.
%Vor%Dies funktioniert mit allen Dateinamen.
%Vor% Wenn Sie jedoch nur einen Befehl ausführen möchten, können Sie xargs
Beispiel: