Wie kann ich foreach * .mp3-Datei rekursiv in einem Bash-Skript machen?

8

Im folgenden Ordner funktioniert das Folgende gut, aber ich möchte auch Unterordner durchsuchen.

%Vor%     
Charlie 10.04.2013, 15:40
quelle

6 Antworten

7

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:

%Vor%

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:

%Vor%

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:

%Vor%

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:

%Vor%

Scheitert immer noch. Die Variable $file aill sieht sie als:

%Vor%

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.

    
David W. 10.04.2013 16:11
quelle
4

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:

%Vor%

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.

    
drquicksilver 10.04.2013 15:42
quelle
4
%Vor%

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 Ссылка

    
hzrari 10.04.2013 22:33
quelle
3
%Vor%     
cdhowie 10.04.2013 15:42
quelle
3

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:

verwenden %Vor%     
user000001 10.04.2013 15:42
quelle
-1

Klingt so, als würden Sie nach dem Befehl find suchen. Ich habe das nicht getestet, aber etwas in dieser Richtung:

%Vor%

BEARBEITEN: Durch Verwendung des Arrays wird der Befehl für Dateien mit Leerzeichen im Namen gesichert.

    
Josh 10.04.2013 15:41
quelle

Tags und Links