Verwenden von scp zum Übertragen einer TXT-Dateiliste von Dateien

4

Ich habe 1,6 Millionen Dateien auf Server A, von denen nur etwa 20.000 auf Server B gelangen müssen. Das Ziel, Server B, befindet sich auf dem gemeinsam genutzten Hosting von GoDaddy, sodass ich mich auf scp beschränke, um viele Dateien gleichzeitig zu übertragen.

Ich möchte aus einer SQL-Abfrage eine TXT-Datei mit mehr als 20.000 Dateien erstellen und diese Liste dann an scp senden. Gibt es dafür Optionen?

cat /proc/version gibt mir Linux version 2.6.32-531.23.3.lve1.2.65.el6.x86_64 ([email protected]) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Tue Aug 19 10:37:27 EDT 2014

Morgan Delaney
quelle
Die Dateinamen werden also in einer SQL-Datenbank gespeichert? Ist auch rsync verfügbar? Dies wäre vorzuziehen. Wenn der SCP mitten in der Übertragung stirbt, müssen Sie herausfinden, was übertragen wurde und was nicht. rsync erledigt diesen Teil für Sie.
Nathan Powell
@ NathanPowell rsyncwar auch mein erster Gedanke, aber GoDaddy hat eine Menge Probleme, neue Software über SSH zu installieren. Ja, die Dateipfade befinden sich derzeit in einer SQL-Datenbank, aber ich kann diese problemlos in eine Textdatei extrahieren.
Morgan Delaney
Eine andere einfache Möglichkeit besteht darin, Links zu diesen Dateien in einem neuen Verzeichnis zu erstellen. Verwenden Sie dann, rsync -Lum die Dateien auf den Remote-Server zu kopieren. Der Hauptnachteil ist, dass Sie das Verzeichnis anschließend bereinigen müssen. Ich denke nicht, dass dies eine formelle Antwort auf diese Frage ist, deshalb habe ich als Kommentar hinzugefügt.
7.

Antworten:

7

Wenn Sie die Textdatei bereits erstellt haben, gehen Sie wie folgt vor

cat /location/file.txt | xargs -i scp {} user@server:/location

Dies geht Zeile für Zeile von der Ausgabe der Datei.txt und führt den Befehl scp pro Zeile aus. Ich hoffe das hilft.

Henry Stark
quelle
Das kommt sehr nahe, danke! Ich hätte diesen Prozess gerne ohne Probleme, und ich fürchte, wenn er Zeile für Zeile ausgeführt wird, werden Sie auf dem Remote-Server in jeder Zeile nach meinem Kennwort gefragt. Ich habe SSH-Schlüssel ausprobiert, aber ohne Erfolg. Vielleicht habe ich es einfach nicht richtig gemacht. Wären SSH-Schlüssel meine einzige Option, um diesen Vorgang zu beenden?
Morgan Delaney
Das hat wunderbar funktioniert! Was ich tat , statt xargsauf dem scpAufruf war Verwendung xargsauf einem cpauf dem Remote - Server die Dateien in ein Verzeichnis, ein wenig wie zu isolieren: cat files.txt | xargs -l bash -c 'cp $0 $1', dann verwendet , um einen einzigen scpBefehl ziehen dieses Verzeichnis. Danke!
Morgan Delaney
1

Die Antwort funktioniert sehr gut. Ich habe xargs -adie Datei immer an standard out gesendet. Ich habe das dann mit der ursprünglichen Antwort von kombiniertcat /location/file.txt | xargs -i scp {} user@server:/location

Meine Antwort:

xargs -a /location/file.txt | xargs -i scp {} user@server:/location
Phil V.
quelle
Was ist der Vorteil einer xargs -aÜberbeanspruchung cat? catist portabler, da die Verfügbarkeit des -afor xargssystemabhängig ist.
Ephsmith
1

Bei den obigen Antworten müssen Sie sich für jede übertragene Datei authentifizieren. SCP läuft auf SSH und GoDaddy bietet über SSH Zugriff auf andere Befehle wie tar. Daher ist die beste Methode, tar mit ssh zu verwenden, und zwar über:

tar -T <file> -cf - | ssh <user>@<host> "tar -C <dir> -xvf -"

Befindet sich die Dateiliste in STDIN, können Sie stattdessen Folgendes tun: Hinweis: cat wird hier nur zum Generieren von STDIN verwendet

cat <file> | tar -T - -cf - | ssh <user>@<host> "tar -C <dir> -xvf -"

Um die Übertragungszeit auf Kosten zusätzlicher Verarbeitungszeit zu verkürzen, können Sie beiden tar-Befehlen -z oder -j hinzufügen, um die Komprimierung von gzip bzw. bzip zu aktivieren.

deAtog
quelle
0

Ich wollte dasselbe für die Liste der Ordner tun, und keine der Antworten, die verwendet wurden, xargsfunktionierte für mich. Am Ende löste ich das einfach mit:

scp -r user@server:/location/{"$(cat folder_list.txt | tr '\n' ',' | sed 's/,$//')"} .

Wo ich meine Dateiliste an die Shell-Erweiterung weitergebe. Ich denke, dass dies für alle hilfreich sein kann, die nach einer alternativen Lösung suchen.

Martin
quelle
0

Ziehen Sie rsync als Alternative in Betracht , die über eine integrierte SSH-Unterstützung verfügt und das Lesen aus einer Liste von Dateien unterstützt, die verwendet werden--files-from .

Beispiel:

rsync -av --progress --partial-dir=/tmp --files-from=file_list.txt . [email protected]:/dest

Vorteile gegenüber scp:

Siehe auch:

qwr
quelle