Hoe kopieer ik alle bestanden van een map naar een externe map met scp?

Mijn doel is om alleen alle bestanden te kopiëren van ~ / local_dir naar [email protected] / var / www / html / target_dir met scp en maak geen local_dir categorie in local_dir.

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

maar niet

/var/www/html/target_dir/local_dir/files.. bij gebruik van -r parameter

Reacties

  • Doet scp * [email protected]:/var/www/html/target_dir niet wat je wilt? Als dit het geval is, bewerken met meer details van wat u ' probeert te doen & hebben het tot nu toe geprobeerd.
  • Toevoegen /. is niet langer werk. Meer hier

Antwoord

scp heeft het -r argument. Dus, probeer het volgende te gebruiken:

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

Het argument -r werkt net als het argument -r in cp, het zal je hele map en alle bestanden en submappen overzetten binnen.

Reacties

  • Uw commando creëerde local_dir directory in / var / www / html / target_dir mijn doel is alleen bestanden kopiëren.
  • Sorry, ik heb het mis. Herhaal dan gewoon de opdracht, maar op deze manier: $ scp -r ~/local_dir [email protected]:/var/www/html/ Hernoem vervolgens de nieuwe map indien nodig.
  • Of $ scp -r ~/local_dir/* [email protected]:/var/www/html/target_dir Wat dan ook drijft uw boot.
  • Verander het jokerteken * in een punt . en jij ' ll kopieer de inhoud van de directory (inclusief eventuele puntbestanden) zonder de directory zelf te kopiëren. scp -pr ~/local_dir/. [email protected]:/path/to/target_dir
  • Helaas wordt het gebruik van . verbroken door een slecht geïmplementeerde scp " bugfix " (zie < superuser.com/questions/1403473/scp-error-unexpected-filename/… ). rsync zou een werkend alternatief zijn.

Antwoord

Als je doel is om alle bestanden van local_dir over te zetten, de * wildcard doet het:

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

De -r optie betekent “recursief”, dus je moet het schrijven als je “een hele directory of meerdere directories probeert over te dragen.

Van man scp:

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

Dus als u submappen heeft binnen local_dir, het laatste voorbeeld zal alleen bestanden overdragen, maar als je de -r optie instelt, zal het bestanden en directories overdragen.

Opmerkingen

  • 1+ Omdat je de opmerkingen in het geaccepteerde antwoord moet lezen om tot het juiste antwoord te komen, terwijl deze het gewoon direct uitlegt.

Answer

/. toevoegen aan uw brondirectory zal de inhoud ervan overdragen in plaats van de directory zelf. In tegenstelling tot de wildcard-oplossing, zal dit ook alle verborgen bestanden bevatten.

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

De eer voor deze oplossing gaat naar roaima, maar ik dacht dat het gepost moest worden als een daadwerkelijk antwoord, niet alleen een opmerking.

Opmerkingen

Answer

Volg deze stappen:

  1. Directory kopiëren local_dir met al zijn submappen:

    scp -r ~/local_dir [email protected] /var/www/html/target_dir 
  2. kopieer alleen de inhoud van local_dir en niet de directory local_dir zelf:

    scp -r ~/local_dir/* [email protected] /var/www/html/target_dir 
  3. Gebruik niet: scp -r ~/local_dir/. [email protected] /var/www/html/target_dir als het genereert een fout (zojuist getest en kreeg de volgende foutmelding):

    scp: error: unexpected filename: . 

Reacties

  • Ik krijg ook de fout van een onverwachte bestandsnaam. Het gebruik van het jokerteken werkt echter ook niet, omdat de directory zoveel bestanden bevat dat de tekenlimiet voor opdrachten wordt overschreden wanneer het jokerteken wordt uitgebreid. macOS
  • @RichardKiefer: je kunt jokertekens gebruiken zoals? met * om de zoekresultaten verder te isoleren en vervolgens door te geven aan scp. Probeer deze link, het kan helpen: Wildcards
  • Bedankt Syed, maar mijn punt was dat ik eigenlijk alle elementen in de map wil targeten , en niet filteren. En als mijn directory teveel heeft, dan werkt het jokerteken gewoon niet.
  • @RichardKiefer: Mijn excuses Richard, om alle bestanden te laten kopiëren, kunnen we een klein bash-script gebruiken. Gebruik: ls -l | awk '{print $9}' en stuur alle output (dat zijn alle bestandsnamen) om naar een txt-bestand. Lees het txt-bestand, regel voor regel, en gebruik die invoer met scp om de bestanden te kopiëren: input=/home/user/filename.txt while IFS= read -r line

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *