一行快速在遠端、本機傳遞資料 (夾) - tar / rsync



前言

  • 從 remote server 要打包資料夾或檔案到本機、或是從本機推送資料夾到 remote server 時,不用壓縮落檔、改用一行處理掉的方式比較簡潔。

  • 如果方便用 rsync 還是使用 rsync 比較好。




做法

tar & pipe

  • 從 remote server 打包資料夾到本機:
1
ssh user@host "tar -C /path/to/data/ -zc directory_name" | tar zx 
  • 反過來,從本機打包資料夾傳送到 remote server:
1
tar zc directory_name/ | ssh user@host "tar zx -C /new/path/to/data/"

其中:

  • z:代表使用 gzip 處理

  • ccreate,新增壓縮檔儲存壓縮結果

  • xextract,解壓縮

  • 如果要覆蓋目標位置的資料夾,要配上 --recursive-unlink 參數:

1
tar zc directory_name/ | ssh user@host "tar zx -C --recursive-unlink /new/path/to/data/"

rsync

1
rsync -azP /path/to/data/ user@server:/new/path/to/data/

其中

  • a:等同參數 -rlptgoD,代表「保留原有資訊、包含特殊檔案、包含連結、包含子資料夾」:

    • 原有資訊:諸如檔案權限、owner、group、編輯時間等

    • 連結:soft link 等

    • 特殊檔案:例如 named sockets and fifos

    • 子資料夾:也就是 recursive 模式

  • z:傳輸前要壓縮

  • P:等同下兩參數 --progress--partial,代表顯示進度、與保留部分檔案。--partial 在傳輸超大檔案時很有用,斷線或其他問題可以之後接續處理。


如果 tar 跳錯…

  • 如果發現在用 tar 時有類似這樣錯誤:
1
tar: Ignoring unknown extended header keyword LIBARCHIVE.xattr.com.apple.quarantine

這是因為 mac 在壓縮的時候會包進一些 header,結果卻讓 linux 無法辨認導致。

解決方法:

  1. 安裝 gnu-tarbrew install gnu-tar

  2. .bashrc / .zshrc 新增環境變數:

PATH="$(brew --prefix)/opt/gnu-tar/libexec/gnubin:$PATH"

exec $SHELL 或是重新登入之後,就可以用到 gnu 版的 tar 囉!




REF

Licensed under CC BY-NC-SA 4.0
最後更新 2024-05-24 14:47

主題 StackJimmy 設計