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ę.

użytkownik13184
źródło

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 .
akira
źródło
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 .

Carlos Rodrigues
źródło
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,
2
for f in `find . -name "*"`;do scp $f phogan@computer/directory;done
John T.
źródło
tak, i tak chce jednego polecenia
John T
przydatne, użyłem go zgrep -l pattern *
Tanj
Nie działa na pliki ze spacjami.
Christophe De Troyer
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.

Erik Sjölund
źródło