Cum să copiați toate fișierele dintr-un director într-un director la distanță folosind scp?

Scopul meu este să copiez numai toate fișierele ~ / local_dir la [email protected] / var / www / html / target_dir utilizând scp și nu creați categoria local_dir în local_dir.

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

dar nu

/var/www/html/target_dir/local_dir/files.. când utilizați parametrul -r

Comentarii

  • scp * [email protected]:/var/www/html/target_dir nu face ceea ce doriți? Dacă da, vă rugăm să editați cu mai multe detalii despre ceea ce ' încercați să faceți & am încercat până acum.
  • Adăugarea /. nu mai este de lucru. Mai multe aici

Răspuns

scp are argumentul -r. Deci, încercați să utilizați:

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

Argumentul -r funcționează la fel ca -r arg în cp, vă va transfera întregul folder și toate fișierele și subdirectoarele înăuntru.

Comentarii

  • Comanda dvs. a creat directorul local_dir în / var / www / html / target_dir obiectivul meu este să copiez numai fișiere.
  • Ne pare rău, am greșit. Apoi repetați comanda, dar așa: $ scp -r ~/local_dir [email protected]:/var/www/html/ Apoi redenumiți noul director dacă este necesar.
  • Sau $ scp -r ~/local_dir/* [email protected]:/var/www/html/target_dir plutește barca dvs.
  • Schimbați wildcard-ul * într-un punct . și dvs. ' Voi copia conținutul directorului (inclusiv orice fișiere punct) fără a copia directorul în sine. scp -pr ~/local_dir/. [email protected]:/path/to/target_dir
  • Din păcate, utilizarea . a fost întreruptă de un scp " remedierea erorilor " (vezi < superuser.com/questions/1403473/scp-error-unexpected-filename/… ). rsync ar fi o alternativă de lucru.

Răspuns

Dacă obiectivul dvs. este să transferați toate fișierele din local_dir wildcard-ul * face trucul:

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

Opțiunea -r înseamnă „recursiv”, deci trebuie să o scrieți atunci când încercați să transferați un director întreg sau mai multe directoare.

Din man scp:

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

Deci, dacă aveți subdirectoare în interiorul local_dir, ultimul exemplu va transfera numai fișiere, dar dacă setați opțiunea -r, acesta va transfera fișiere și directoare.

Comentarii

  • 1+ Pentru că trebuie să citiți comentariile din răspunsul acceptat pentru a ajunge la răspunsul corect, în timp ce acesta îl explică direct.

Răspuns

Se adaugă /. directorul sursă își va transfera conținutul în loc de directorul în sine. Spre deosebire de soluția wildcard, aceasta va include și toate fișierele ascunse.

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

Creditul pentru această soluție revine la roaima, dar am considerat că ar trebui să fie postat un răspuns real, nu doar un comentariu.

Comentarii

Răspuns

Urmați acești pași:

  1. Copiați directorul local_dir cu toate subdirectoarele sale:

    scp -r ~/local_dir [email protected] /var/www/html/target_dir 
  2. copiați doar conținutul local_dir și nu directorul local_dir în sine:

    scp -r ~/local_dir/* [email protected] /var/www/html/target_dir 
  3. Nu utilizați: scp -r ~/local_dir/. [email protected] /var/www/html/target_dir as generează o eroare (tocmai am testat și am primit următoarea eroare):

    scp: error: unexpected filename: . 

Comentarii

  • De asemenea, primesc eroarea unui nume de fișier neașteptat. Cu toate acestea, folosirea metacaracterului nu funcționează, deoarece directorul are atât de multe fișiere care depășește limita de caractere pentru comenzi atunci când metacaracterul este extins. macOS
  • @RichardKiefer: Puteți folosi metacaracteri ca? cu * pentru a izola în continuare rezultatele căutării și apoi pentru a le transmite scp. Încercați acest link, poate ajuta: Wildcards
  • Mulțumesc Syed, dar ideea mea a fost că vreau să vizez toate elementele din dosar , și nu filtrați niciunul. Și dacă directorul meu are prea multe, atunci nu va funcționa wildcard-ul.
  • @RichardKiefer: scuzele mele Richard, pentru a copia toate fișierele putem folosi un mic script bash. Utilizați: ls -l | awk '{print $9}' și redirecționați toate ieșirile (care ar fi toate numele fișierelor) către un fișier txt. Citiți fișierul txt, rând pe rând și utilizați acea intrare cu scp pentru a copia fișierele: input=/home/user/filename.txt while IFS= read -r line

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *