目的
- ファイルサイズなどの関係で 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)