Verschieben einer großen Anzahl von Dateien (~ 100 000)

13

Ich arbeite mit Ordnern, die viele Dateien enthalten, z. B. 100.000 oder sogar 1.000.000 Dateien pro Ordner. Wenn ich versuche, den Inhalt eines Ordners in einen anderen zu verschieben, bleibt mein Computer immer hängen. Selbst wenn der Vorgang abgeschlossen zu sein scheint, kann ich den Inhalt eines Ordners nicht sehen, da Nautilus vollständig eingefroren zu sein scheint und ich meinen Computer zum Neustart zwingen muss. Mir ist aufgefallen, dass dies auch passiert, wenn ich versuche, wie 10 000 Dateien zu verschieben.

Ist das ein Problem meines Computers oder ist es normal, wenn ich mit diesen Nummern arbeite?

Gibt es eine clevere Möglichkeit, diese Dateiübertragung durchzuführen?

Hyperion
quelle
3
Was ist mit der Verwendung des Terminals ( cp -R SRC/ DEST/)
UniversallyUniqueID
2
@BharadwajRaju: Abhängig von den Dateien könnte cp -a besser sein, da Eigentümer, Zeitstempel und Berechtigungen erhalten bleiben. Ich würde rsync auch empfehlen, da es Übertragungen überprüfen und nur Dateien kopieren kann, die noch nicht existieren.
Michael
Update: gvfs-copy(aus dem gvfs-binPaket) kann schneller sein als cp.
UniversallyUniqueID
Sie haben hier zwei Fragen anstelle von einer. Bitte überprüfen Sie die How To Ask Seite für Anweisungen.
Luís de Sousa

Antworten:

19

Erwägen Sie möglicherweise die Verwendung einer reinen Befehlszeilenmethode zum Übertragen sehr großer Dateien. Sie werden zweifellos feststellen, dass der Vorgang wesentlich schneller ist als die Verwendung einer GUI.

Es gibt viele verschiedene Möglichkeiten, um dies zu erreichen, aber die folgenden haben auf meinem System schnell, sicher und effizient funktioniert:

find . -maxdepth 1 -type f -print0 | xargs -0 mv -t <destination>

Einige Erklärungen für diesen Befehl:

  1. Ihr Eingabeverzeichnis ist das '.' Zeichen und für diesen bestimmten Befehl müssen Sie in diesem Verzeichnis sein
  2. Ihr Ausgabeverzeichnis ist das <destination>in meinem Beispiel. Passen Sie dies natürlich an Ihre Bedürfnisse an und lassen Sie die Klammern weg.
  3. Diese Syntax erlaubt Dateinamen mit Leerzeichen als Bonus :)

Endlose Permutationen sind möglich, aber dies sollte gut und viel effizienter als die GUI funktionieren . Eine Permutation zum Beispiel: Wenn Sie nur PDF-Dateien verschieben möchten, können Sie Folgendes ausführen:

find . -iname "*.pdf" -maxdepth 1 -type f -print0 | xargs -0 mv -t <destination>

Die Verwendung von xargseröffnet viele Möglichkeiten, insbesondere beim Verschieben einer so großen Anzahl von Dateien. Viele, viele Möglichkeiten ....

Potenzielle Probleme:

Es gibt mindestens zwei mögliche Fallstricke, über die man nachdenken kann, dank der Kommentatoren unten für diese Gedanken:

  1. Ihr Zielverzeichnis könnte beschädigt sein, an einem anschließend nicht erreichbaren Ort, durch Tippfehler usw. mvwerden die Dateien weiterhin dorthin verschoben! Sei hier vorsichtig ...
  2. Wenn die -tOption ( --target-directory) fehlt und der Zielordner tatsächlich eine Datei ist, verschieben Sie eine Datei und schlagen im Übrigen fehl. mvhat 2 verwendet: Umbenennungs der Quelle zum Ziel oder verschieben Quelle Verzeichnis . Seien Sie wieder vorsichtig ...
andrew.46
quelle
2
Würde nicht einfach find . -maxdepth 1 -type f -exec mv -t test {} +tun?
muru
@muru: Danke dafür, ich habe mich auf überflüssiges -name...Stück zurechtgeschnitten, aber ich habe xargsan Ort und Stelle gelassen .
andrew.46
2
Ich weiß nicht ... Während der Befehl offensichtlich korrekt ist, würde ich einen kompletten Zug als etwas zu fehleranfällig betrachten. (Was ist, wenn Sie zum Beispiel vergessen , die einschließen -tFlagge? Ich denke , alle Dateien würden „verschoben“ zu einer einzigen Datei aufgerufen werden test, was den Verlust aller Dateien mit einer Ausnahme.) Ich glaube , ich würde ein lieber rsyncvon gefolgt, wenn alles gut gegangen ist, a rm. Ich kann mir jedoch Szenarien vorstellen, in denen eine solche Überprüfung nicht automatisiert werden kann.
Jos
@Jos: Danke, ich habe eine Fußzeile hinzugefügt, die diese Möglichkeit beschreibt. Schön, ein rsync Beispiel als Antwort zu sehen?
andrew.46
Linux unterstützt extrem lange Argumentlisten. Dies können Sie wahrscheinlich tun mv dir1/* dir2und nur dann, find -execwenn es ein Problem gibt oder wenn Sie vermeiden müssen, Ordner mit Ihrem Glob abzugleichen. (Obwohl dies von Ihren Namenskonventionen abhängt, *.*stimmen häufig die meisten Dateien, aber nicht die meisten Verzeichnisse überein, da es häufig vorkommt, dass .extensionDateien aktiviert sind und .Verzeichnisnamen nicht vorhanden sind.)
Peter Cordes
4

Ich hatte vorher ähnliche Erfahrungen gemacht, es ist normal, wenn es um eine große Anzahl von Dateien geht. Ich hatte eine große Sammlung von PDF-Datenblättern (elektronische Teile).

GUI-Tools suchen nach Dateidetails und Metadaten (Icon / Thumbnail, Size, ...). In diesem Fall ist dies eine große Sache. Selbst in der Symbolansicht und ohne Miniaturansichten frieren sie ein, da die meisten von ihnen nicht für diesen Extremfall ausgelegt sind. Das GUI-Tool versucht, Präsentationssymbole für alle Dateien / Ordner im Verzeichnis zu laden, auch wenn diese Elemente für den Benutzer im aktuellen Bildschirmbereich nicht sichtbar sind. Das Sortieren ist ebenfalls Teil des Problems und kann nicht umgangen werden.

  • Am Ende teile ich Dateien in separate Ordner auf, basierend auf Marke / Modell mit jeweils weniger als 10000. Möglicherweise können Sie Datum (wie die meisten Leute es mit Fotos / Scans tun) oder Anfangsbuchstaben (wie im Ubuntu-Paket-Repository ) verwenden.
  • Es ist einfacher, CLI-Tools zu verwenden, da sie nur das zeigen, was Sie angefordert haben. Sie können locatefür die schnelle Suche anstelle von verwenden find.
  • Verwenden Sie für den Verschiebevorgang mvim Terminal (GUI-Tools sind langsam, da sie versuchen, die Ansicht regelmäßig zu aktualisieren).

    Wenn es sich in derselben Partition befindet, ändert der Befehl nur die Zeiger im Dateisystemindex. Wenn nicht, wird es Dual-Operation sein (Kopieren & Löschen). Das wird teuer.

Es gibt nur einen Fall, bei dem ich helfen kann: Wenn Sie diese Dateien mehrmals kopieren und sie nicht aktualisiert werden. Jedes Mal, wenn ich versuche, meine Sammlung zu kopieren, dauert es ein Jahrzehnt. (Dies ist nur bei kleinen Dateien nützlicher.)

  • Erstellen Sie ein einzelnes Paket oder einige Pakete, wie z. B. zip ohne / mit geringer Komprimierung. Wenn Sie es kopieren, wird es schneller, also lassen Sie DMA seine Arbeit erledigen.
user.dz
quelle
3

Wenn Sie nach einer Lösung suchen, die die Vorteile der Befehlszeilenoperationen mit dem GUI-Feeling und der Flexibilität kombiniert, empfehle ich mc( Mitternachtskommandant ).

mc commander 2-teilige Ansicht

Es ist ein ncurses-basierter visueller Dateimanager - Sie haben eine Ansicht mit zwei Fenstern für Ihre Dateien und ein Menü zur Verfügung. Die Verwendung der Maus ist auch über SSH möglich. Sie können in Ihrem Dateisystem stöbern, Dateien mit dem Datei-Viewer untersuchen, direkt nach Kriterien filtern und die Kopier- oder Verschiebevorgänge in der Befehlszeile ausführen.

Es ist ein Klon des DOS-Programms Norton Commander , das Mitte der achtziger Jahre populär war. Es funktioniert immer dann, wenn die GUI für mich unzuverlässig wird, und ist ideal für Ihren Zweck.

emk2203
quelle
0

Ich bin auf ähnliche Probleme gestoßen - ich habe mein RAID-Setup getestet und bei großen Übertragungen (z. B. mehr als 100.000 Dateien und 1-2 TB Daten auf einmal) scheinen die Übertragungen ziemlich schnell zu beginnen - sagen wir mal ~ 200 MB / Sek. Verlangsamen Sie dann schnell auf ein vernünftiges Plateau von ~ 90-120 MB / s (möglicherweise nachdem Sie etwas Flash-Cache-Speicher auf den Laufwerken verbraucht haben). Nach 20 bis 30 Minuten beginnt die Operation allmählich auf ein viel niedrigeres Plateau (~ 30 bis 40 MB / s) abzusinken, was bei kleinen Dateien schlimmer ist - eine 4-5-stündige Operation dauert näher an 15 Stunden.

Ich habe einige Zeit damit verbracht, zu diagnostizieren - z. B. mögliche Laufwerksfehler. Obwohl ich verschiedene Tools ausprobiert habe - Befehlszeile, Nautilus -, konnte ich für sehr große Kopiervorgänge keinen angemessenen Durchsatz erzielen.

Für mich funktionierte es am besten, den Mitternachtsbefehlshaber zu verwenden, und wenn das Kopieren langsam wurde, unterbrach ich den Vorgang, bis die Festplattenanzeige erlosch, nachdem alle ausstehenden Vorgänge gelöscht wurden - normalerweise eine Minute oder so - und unterbrach dann MC erneut und es würde für weitere 20-30 Minuten auf ein anständiges Tempo zurückschießen. Ziemlich nervig.

M Szil
quelle