Jeffrey Cross
Jeffrey Cross

Umgang mit einer großen Anzahl von Dateien in Unix

In den meisten Fällen können Sie mehrere Dateien von einem Ordner in einen anderen verschieben, indem Sie einen einfachen mv-Befehl wie "mv sourcedir / * destdir /“. Das Problem ist, dass, wenn das Sternchen erweitert wird, jede Datei im Verzeichnis als Befehlszeilenparameter zum Befehl mv hinzugefügt wird. Wenn sourcedir viele Dateien enthält, kann dies zu einem Überlauf des Befehlszeilenpuffers führen, was zu einem mysteriösen Fehler "Zu viele Argumente" führt.

Ich habe vor kurzem dieses Problem festgestellt, als ich versuchte, ein Verzeichnis zu verwalten, das über eine Million Dateien enthielt. Es ist nicht jeden Tag, dass Sie auf ein Verzeichnis stoßen, in dem sich eine große Anzahl von Dateien befindet, aber wenn das Problem auftritt, gibt es eine einfache Möglichkeit, es zu lösen. Der Trick besteht darin, das praktische Programm xargs zu verwenden, das eine große Liste als stdin aufnehmen und als Argumente in einen anderen Befehl aufteilen soll:

Sourcedir-Typ suchen f -print | xargs -l1 -i mv {} destdir /

Das -l1 weist xargs an, nur ein Argument zu verwenden, um an mv zu übergeben. Der Parameter -i teilt xargs mit, das {} durch das Argument zu ersetzen. Dieser Befehl führt mv für jede Datei im Verzeichnis aus. Idealerweise würden Sie dies optimieren und etwas wie -l50 angeben, wobei Sie mv 50-Dateien gleichzeitig senden möchten. Ich erinnere mich an xargs, die auf anderen Unix-Systemen gearbeitet haben, aber die GNU xargs, die ich auf meiner Linux-Box habe, zwingen die Anzahl der Argumente auf 1, wenn -i aufgerufen wird. In jedem Fall wird die Arbeit erledigt.

Ohne den Parameter -i funktioniert der Parameter -l in Linux. Sie können die Substitution {} jedoch nicht mehr verwenden, und alle Parameter werden als letzte Argumente im Befehl eingefügt. Dies ist unbrauchbar, wenn Sie einen abschließenden Parameter wie das Zielverzeichnis für den Befehl mv hinzufügen möchten. Auf der anderen Seite ist es hilfreich für Befehle, die mit Ihren Dateiparametern enden, z. B. wenn Sie Dateien mit rm im Stapel entfernen.

Seltsamerweise sind die Parameter für Xargs in OS X etwas unkonventionell und großgeschrieben. Die gute Nachricht ist, dass Sie die Parameterersetzung mit mehreren Argumenten gleichzeitig aufrufen können. Versuchen Sie Folgendes, um mehrere Dateien in OS X, 50-Dateien gleichzeitig zu verschieben:

Sourcedir-Typ suchen f -print | xargs -L50 -I {} mv {} destdir /

Das ist ungefähr alles, was dazu gehört. Dies ist nur ein einfaches Beispiel, aber wenn Sie sich erst einmal mit Xargs und dem gemeinsamen Suchen vertraut gemacht haben, ist es ziemlich einfach, die Suchparameter anzupassen und Dateien anhand ihres Datums, ihrer Berechtigungen oder ihrer Dateierweiterung zu verschieben.

Aktie

Leave A Comment