Jak skopiować wszystkie pliki z katalogu do zdalnego katalogu za pomocą scp?

Moim celem jest tylko kopiowanie wszystkich plików z ~ / local_dir to [email protected] / var / www / html / target_dir przy użyciu scp i nie twórz kategorii local_dir w local_dir.

/var/www/html/target_dir/files.. 

ale nie

/var/www/html/target_dir/local_dir/files.. przy użyciu parametru -r

Komentarze

  • Czy scp * [email protected]:/var/www/html/target_dir nie robi tego, co chcesz? Jeśli tak, edytuj , podając więcej szczegółów ' ponownie próbując & próbowałem do tej pory.
  • Dołączanie /. już nie działa. Więcej tutaj

Odpowiedź

scp ma argument -r. Spróbuj więc użyć:

$ scp -r ~/local_dir [email protected]:/var/www/html/target_dir 

Argument -r działa tak samo jak -r arg w cp, przeniesie cały folder oraz wszystkie pliki i podkatalogi wewnątrz.

Komentarze

  • Twoja komenda utworzyła local_dir katalog w / var / www / html / target_dir moim celem jest kopiowanie tylko plików.
  • Przepraszam, pomyliłem się. Następnie po prostu powtórz polecenie, ale w ten sposób: $ scp -r ~/local_dir [email protected]:/var/www/html/ Następnie zmień nazwę nowego katalogu w razie potrzeby.
  • Lub $ scp -r ~/local_dir/* [email protected]:/var/www/html/target_dir Cokolwiek unosi Twoją łódź.
  • Zmień symbol wieloznaczny * na kropkę . i ' ll skopiuj zawartość katalogu (w tym wszelkie pliki z kropkami) bez kopiowania samego katalogu. scp -pr ~/local_dir/. [email protected]:/path/to/target_dir
  • Niestety, używanie . zostało zepsute przez źle zaimplementowaną scp " bugfix " (patrz < superuser.com/questions/1403473/scp-error-uxpressected-filename/… ). rsync byłaby działającą alternatywą.

Odpowiedź

Jeśli Twoim celem jest przeniesienie wszystkich plików z local_dir symbolu wieloznacznego * załatwia sprawę:

$ scp ~/local_dir/* [email protected]:/var/www/html/target_dir 

Opcja -r oznacza „rekurencyjnie”, więc musisz ją zapisać, gdy „próbujesz przenieść cały katalog lub kilka katalogów.

From man scp:

-r Recursively copy entire directories. Note that scp follows symbolic links encountered in the tree traversal. 

Więc jeśli masz podkatalogi w local_dir, ostatni przykład prześle tylko pliki, ale jeśli ustawisz opcję -r, przeniesie pliki i katalogi.

Komentarze

  • 1+ Ponieważ musisz przeczytać komentarze w zaakceptowanej odpowiedzi, aby dostać się do poprawnej odpowiedzi, podczas gdy ten po prostu wyjaśnia to bezpośrednio.

Odpowiedź

Dołączanie /. do katalog źródłowy prześle swoją zawartość zamiast samego katalogu. W przeciwieństwie do rozwiązania z użyciem symboli wieloznacznych, obejmie to również wszystkie ukryte pliki.

$ scp -r ~/local_dir/. [email protected]:/var/www/html/target_dir 

Podziękowania za to rozwiązanie trafia do roaima, ale pomyślałem, że powinno zostać opublikowane jako rzeczywista odpowiedź, a nie tylko komentarz.

Komentarze

Odpowiedź

Wykonaj następujące kroki:

  1. Skopiuj katalog local_dir ze wszystkimi jego podkatalogami:

    scp -r ~/local_dir [email protected] /var/www/html/target_dir 
  2. skopiuj tylko zawartość local_dir a nie sam katalog local_dir:

    scp -r ~/local_dir/* [email protected] /var/www/html/target_dir 
  3. Nie używaj: scp -r ~/local_dir/. [email protected] /var/www/html/target_dir as zgłasza błąd (właśnie przetestowano i otrzymano następujący błąd):

    scp: error: unexpected filename: . 

Komentarze

  • Otrzymuję również błąd związany z nieoczekiwaną nazwą pliku. Jednak użycie symbolu wieloznacznego nie działa, ponieważ katalog zawiera tak wiele plików, że przekracza limit znaków dla poleceń po rozwinięciu symbolu wieloznacznego. macOS
  • @RichardKiefer: Możesz używać symboli wieloznacznych, takich jak? z *, aby dalej izolować wyniki wyszukiwania, a następnie przekazać je do scp. Wypróbuj ten link, może pomóc: Symbole wieloznaczne
  • Dziękuję Syed, ale chodziło mi o to, że tak naprawdę chcę kierować reklamy na wszystkie elementy w folderze i nie filtruj żadnych. A jeśli w moim katalogu jest za dużo, to symbol wieloznaczny po prostu nie zadziała.
  • @RichardKiefer: Przepraszam Richard, aby skopiować wszystkie pliki, możemy użyć małego skryptu bash. Użyj: ls -l | awk '{print $9}' i przekieruj wszystkie dane wyjściowe (które będą wszystkimi nazwami plików) do pliku tekstowego. Przeczytaj plik txt, po jednej linii na raz i użyj tego wejścia z scp, aby skopiować pliki: input=/home/user/filename.txt while IFS= read -r line

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *