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 (mockbuild@koji.cloudlinux.com) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Tue Aug 19 10:37:27 EDT 2014


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.


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

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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.