Hvordan kopierer jeg alle filer fra en katalog til en ekstern katalog ved hjelp av scp?

Målet mitt er bare å kopiere alle filer fra ~ / local_dir til [email protected] / var / www / html / target_dir ved hjelp av scp og ikke opprett lokal_dir-kategori i local_dir.

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

men ikke

/var/www/html/target_dir/local_dir/files.. når du bruker -r parameter

Kommentarer

  • Gjør ikke scp * [email protected]:/var/www/html/target_dir det du vil? Hvis ja, vennligst rediger med mer detaljer om hva du ' prøver å gjøre & har prøvd så langt.
  • Appending /. er ikke lenger arbeid. Mer her

Svar

scp har argumentet -r. Så prøv å bruke:

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

Argumentet -r fungerer akkurat som -r arg i cp, det vil overføre hele mappen og alle filene og underkatalogene inne.

Kommentarer

  • Kommandoen din opprettet local_dir katalog i / var / www / html / target_dir Målet mitt er å kopiere bare filer.
  • Beklager, jeg har feil. Så er det bare å gjenta kommandoen, men slik: $ scp -r ~/local_dir [email protected]:/var/www/html/ Endre navn på ny katalog hvis nødvendig.
  • Eller $ scp -r ~/local_dir/* [email protected]:/var/www/html/target_dir Uansett flyter båten din.
  • Endre jokertegnet * til et punktum . og du ' Kopier kataloginnholdet (inkludert eventuelle punktfiler) uten å kopiere katalogen. scp -pr ~/local_dir/. [email protected]:/path/to/target_dir
  • Dessverre har bruk av . blitt brutt av en dårlig implementert scp " bugfix " (se < superbruker.com/questions/1403473/scp-error-unexpected-filename/… ). rsync ville være et fungerende alternativ.

Svar

Hvis målet ditt er å overføre alle filer fra local_dir * jokertegnet gjør susen:

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

Alternativet -r betyr «rekursivt», så du må skrive det når du prøver å overføre en hel katalog eller flere kataloger.

Fra man scp:

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

Så hvis du har underkataloger i local_dir, det siste eksemplet vil bare overføre filer, men hvis du angir alternativet -r, vil det overføre filer og kataloger.

Kommentarer

  • 1+ Fordi du trenger å lese kommentarene i det aksepterte svaret for å komme til riktig svar, mens denne bare forklarer det direkte.

Svar

Legger til /. til kildekatalogen din vil overføre innholdet i stedet for selve katalogen. I motsetning til jokertegnløsningen vil dette også inkludere skjulte filer.

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

Kreditt for denne løsningen går til roaima, men jeg tenkte at den skulle bli lagt ut som et faktisk svar, ikke bare en kommentar.

Kommentarer

Svar

Følg disse trinnene:

  1. Kopier katalog local_dir med alle underkatalogene:

    scp -r ~/local_dir [email protected] /var/www/html/target_dir 
  2. bare kopier innholdet i local_dir og ikke katalogen local_dir i seg selv:

    scp -r ~/local_dir/* [email protected] /var/www/html/target_dir 
  3. Ikke bruk: scp -r ~/local_dir/. [email protected] /var/www/html/target_dir som det kaster en feil (nettopp testet og mottatt følgende feil):

    scp: error: unexpected filename: . 

Kommentarer

  • Jeg får også feilen med uventet filnavn. Imidlertid fungerer ikke jokertegnet heller, fordi katalogen har så mange filer som overstiger tegngrensen for kommandoer når jokertegnet blir utvidet. macOS
  • @RichardKiefer: Du kan bruke jokertegn som? med * for å isolere søkeresultatene ytterligere og deretter overføre dem til scp. Prøv denne lenken, det kan hjelpe: Jokertegn
  • Takk Syed, men poenget mitt var at jeg faktisk vil målrette mot alle elementene i mappen , og ikke filtrere noen. Og hvis katalogen min har for mange, vil ikke jokertegnet bare fungere.
  • @RichardKiefer: Jeg beklager Richard, for å få alle filene kopiert kan vi bruke et lite bash-skript. Bruk: ls -l | awk '{print $9}' og omdiriger all utdata (som vil være alle filnavnene) til en txt-fil. Les txt-filen, en linje om gangen, og bruk den inngangen med scp til å kopiere filene: input=/home/user/filename.txt while IFS= read -r line

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *