目的
- ファイルサイズなどの関係で CI の artifacts を CI の外で管理したい
- 送信側 (Docker image) に手を加えずに解決したい (rsync などを入れない)
結果
シンプル
scp -pr srcdir user@host:~/destdir
-
~/destdir
が存在しない:srcdir/file
は~/destdir/file
へ -
~/destdir
が存在する:srcdir/file
は~/destdir/srcdir/file
へ -
srcdir/
にしても変わらない (参考:scpとrsyncでパスのケツスラッシュのありなしの挙動を毎回迷うのでメモ - 俺たちのブログ)
結論: 統合後のパスに srcdir
を含めたくないので使えない
ワイルドカード
scp -pr srcdir/* user@host:~/destdir
-
~/destdir
の有無に関わらずsrcdir/file
は~/destdir/file
へ -
srcdir/.dotfile
はコピーされない場合が多い(シェルの設定による)
結論: 悪くはないが完全ではない
スラッシュドット
scp -pr srcdir/. user@host:~/destdir
-
~/destdir
の有無に関わらずsrcdir/file
は~/destdir/file
へ -
srcdir/.dotfile
も~/destdir/.dotfile
にコピーされる -
cd srcdir; scp -pr . user@host:~/destdir
と等価のはず
結論: 使える
その他
- 転送先のディレクトリは1階層しか作ってくれないので、深いところに直接コピーする場合は
ssh user@host mkdir -p ~/destdir/path/to/target
などが必要 - rsync なら
rsync -avz srcdir/ user@host:destdir
が正義 (参考:地雷だらけのrsyncを理解する。 - こせきの技術日記) - tar と ssh を組み合わせる方法もある (参考:sshだけでファイル・ディレクトリ転送(scp, sftpなし) - Qiita)