複製成萬上萬個小檔案時,cp -r 因頻繁 open/close/getattr/setattr 系統呼叫、目錄項更新、日誌寫入,效能極差。本文提供兩大核心加速策略:**tar 管線串流複製** (避免中間檔) 與 **cp 保留屬性參數**,並附贈進度顯示腳本。
cd /src/dir
tar cf - . | (cd /dst/dir && tar xf -)
cf -:建立檔案輸出至 stdout (-)。xf -:從 stdin 解包。# 推送:本機打包 → SSH → 遠端解包
tar cf - /src/dir | ssh user@remote "cd /dst && tar xf -"
# 拉取:遠端打包 → SSH → 本機解包
ssh user@remote "cd /src && tar cf - dir" | tar xf - -C /dst
# 透過 nc (內網高速,無加密開銷)
# 接收端
nc -l -p 5555 | tar -C /dst -xf -
# 發送端
tar cf - /src | nc remote_ip 5555
tar cf - /src | pigz -p 4 | ssh user@remote "cd /dst && unpigz | tar xf -"
# 或 zstd (壓縮率/速度更佳)
tar cf - /src | zstd -T4 | ssh user@remote "cd /dst && zstd -d | tar xf -"
cp -a /src /dst
# -a = -dR --preserve=all
# -d: 保留符號連結 (不追蹤)
# -R: 遞迴
# --preserve=all: mode,ownership,timestamps,context,links,xattr,all
若需指定保留屬性:cp --preserve=mode,ownership,timestamps -R /src /dst。
#!/bin/bash
cd /src
for f in *; do
cp -a "$f" /dst/
echo "Copied: $f"
done
或使用 rsync -av --info=progress2 /src/ /dst/ (單檔進度 + 整體進度 + 斷點續傳),**通常比 cp 更快且功能更強**。
cp -a 或 rsync -a 通常最快 (無壓縮開銷)。