Za pomocą scp przesłać listę plików .txt

4

Mam 1,6 miliona plików na serwerze A, a tylko około 20 tysięcy z nich musi dotrzeć do serwera B. Miejsce docelowe, serwer B, znajduje się na wspólnym serwerze GoDaddy, więc jestem ograniczony do scp do przesyłania wielu plików jednocześnie.

Chciałbym wygenerować plik .txt z tych plików 20k + z zapytania SQL, a następnie przekazać tę listę do scp. Czy są jakieś opcje, aby to zrobić?

cat /proc/version daje mi 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
źródło
Więc nazwy plików są przechowywane w bazie danych sql? Czy dostępny jest także rsync? Byłoby to preferowane. Jeśli scp zginie w środku transferu, będziesz musiał dowiedzieć się, co zostało przeniesione, a co nie. rsync zrobi to za ciebie.
Nathan Powell
@NathanPowell rsync to była też moja pierwsza myśl, ale GoDaddy ma mnóstwo blokad na instalowaniu nowego oprogramowania dzięki ich SSH. Tak, ścieżki plików są obecnie w bazie danych SQL, ale mogę je łatwo wyodrębnić do pliku tekstowego.
Morgan Delaney

Odpowiedzi:

6

jeśli masz już plik tekstowy, wykonaj następujące czynności

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

spowoduje to przejście do wiersza po pliku wyjściowym pliku.txt i uruchomienie komendy scp na linię; Mam nadzieję, że to pomoże.

henry Stark
źródło
To bardzo blisko, dziękuję! Chciałbym jednak, aby ten proces był bezproblemowy i obawiam się, że jeśli będzie działał liniowo, będzie pytał o moje hasło na zdalnym serwerze w każdej linii. Próbowałem kluczy SSH, ale bez powodzenia, może po prostu nie robiłem tego dobrze. Czy klucze SSH byłyby moją jedyną opcją, aby proces ten był bezproblemowy?
Morgan Delaney
To działało cudownie! Co zrobiłem zamiast xargs na scp połączenie było używane xargs na cp na zdalnym serwerze, aby odizolować pliki do katalogu, trochę jak: cat files.txt | xargs -l bash -c 'cp $0 $1', a następnie użyłem singla scp polecenie do pobrania tego katalogu. Dziękuję Ci!
Morgan Delaney
1

Dostarczona odpowiedź działa świetnie. użyłem xargs -a wysłać plik do standardowego wyjścia. Następnie połączyłem to z oryginalną odpowiedzią cat /location/file.txt | xargs -i scp {} user@server:/location

Moja odpowiedź:

xargs -a /location/file.txt | xargs -i scp {} user@server:/location
Phil V.
źródło
Jakie są korzyści xargs -a ponad używanie cat? cat jest bardziej przenośny, ponieważ dostępność -a dla xargs jest zależny od systemu.
ephsmith
0

Powyższe odpowiedzi wymagają uwierzytelnienia dla każdego przesłanego pliku. SCP działa na szczycie SSH, a GoDaddy zapewnia dostęp do innych poleceń nad SSH, takich jak tar. Dlatego najlepszą metodą jest użycie taru z ssh przez:

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

Jeśli lista plików znajduje się na STDIN, możesz wykonać następujące czynności: Uwaga: cat jest tutaj używany tylko do generowania STDIN

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

Aby skrócić czas transferu kosztem dodatkowego czasu przetwarzania, możesz dodać -z lub -j do obu poleceń tar, aby odpowiednio włączyć kompresję gzip lub bzip.

deAtog
źródło
0

Chciałem zrobić to samo dla listy folderów i żadnej z odpowiedzi używając xargs pracował dla mnie. W końcu rozwiązałem to po prostu:

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

Gdzie przekazuję listę plików do rozszerzenia powłoki. Myślę, że może to być pomocne dla każdego, kto szuka alternatywnego rozwiązania.

Martin
źródło