萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

加速 Linux 大量小檔案複製的兩大核心技巧:tar 管線與保留屬性

複製成萬上萬個小檔案時,cp -r 因頻繁 open/close/getattr/setattr 系統呼叫、目錄項更新、日誌寫入,效能極差。本文提供兩大核心加速策略:**tar 管線串流複製** (避免中間檔) 與 **cp 保留屬性參數**,並附贈進度顯示腳本。

技巧一:tar 管線 — 邊打包邊傳輸邊解包 (零落地)

本機目錄間

cd /src/dir
tar cf - . | (cd /dst/dir && tar xf -)
  • cf -:建立檔案輸出至 stdout (-)。
  • xf -:從 stdin 解包。
  • 單一進程串流,**無臨時壓縮檔、無額外 I/O**,保留權限、時間戳、連結、擴充屬性。

跨主機 (SSH)

# 推送:本機打包 → 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 保留完整屬性參數

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 更快且功能更強**。

效能對比心得

  • 本機 SSD→SSD:cp -a 或 rsync -a 通常最快 (無壓縮開銷)。
  • HDD、網路、大量小檔:**tar 管線 > rsync > cp**。
  • 跨公網:**tar + zstd + SSH** 平衡速度與頻寬。
  • **選工具前先思考**:資料特性、網路、儲存介質、是否需保留屬性、是否需斷點續傳。

tar 管線複製示意圖

copyright © 萬盛學電腦網 all rights reserved