Chciałbym przenieść wyjście find do listy wejściowej SCP, jak?


10

Jestem początkującym użytkownikiem Linuksa i próbuję wysłać długą listę plików z jednego komputera na drugi. Lista argumentów jest za długa, więc używam find. Mam jednak problem z ustawieniem wyrażenia. Czy ktoś może pomóc?

Oto, co zwykle wpisałbym na krótką listę argumentów.

scp ./* phogan@computer/directory...

Oto myślę, że może to przełożyć się na find.

scp find . -name "*" phogan@computer/directory...

Może mógłbym użyć rurki? Wszelkie sugestie mogłyby pomóc. Z góry dziękuję.

Odpowiedzi:


16
find . -name "*" -exec scp '{}' phogan@computer:/directory ';'

Zwykle „tarowałbym” wszystkie pliki razem w jedną wielką kroplę i wywoływałbym „scp” tylko raz. Coś takiego:

tar czfv - file1 file2 dir1 dir2 | ssh phogan@computer/ tar xvzf - -C directory
  • Można się bawić z parametrami tar --exclude = lub --include =.
  • Inną opcją byłoby użycie rsync .

jeśli korzystasz z haseł z ssh / scp, czy rozwiązanie z find nie poprosi o hasło do każdego pliku?
quack quixote

załóżmy, że wie, jak używać kluczy ssh :) problem z 1000 pytaniami o hasło jest również przyczyną tar-podejścia
akira

15

Możesz to zrobić za pomocą jednego polecenia scp.

  • dla nowszych wersji scp:
scp `find <path> -name <expression>` user@host:<path_where_to_copy>
  • dla starszych wersji:
scp --exec=`find <path> -name <expression>` user@host:<path_where_to_copy>

Pamiętaj, aby umieścić findpolecenie między znakami wstecznymi a nie pojedynczymi cudzysłowami .


Która wersja SCP, która to dystrybucja Linuksa to? Np. Scp w Ubuntu 14.04 nie ma tej opcji.
geekQ

2
Cześć, starsze wersje obsługują to, nowe wersje obsługują prostsze polecenie:scp `find <path> -name <expression>` user@host:<path_where_to_copy>
Carlos Rodrigues

1
Nie działa na wielu plikach
Amruta,

@Amruta use-r
slybloty

@slybloty scp -rsłuży do rekursji pojedynczego wpisu (katalogu), a nie do wielu wpisów (wielu plików).
AndrewF,


1

sugerowałbym

find . -print0 | tar --null --files-from=/dev/stdin -cf - | ssh phogan@computer tar -xf - -C /directory

Zauważ, że to rozwiązanie pozwala uniknąć nazw plików w wierszu poleceń, gdzie można je interpretować jako argumenty wiersza poleceń.

Inną rzeczą, na którą należy zwrócić uwagę, jest to, że nazwy plików mogą zawierać spacje. Oznacza to, że pętla for w bash może mieć trudności z listą nazw plików.

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.