xargs输入变命令行参数cpio打包解压文件

  • xargs:把标准输入变成命令行参数,解决“参数太多”或需要批量执行的问题。
  • cpio:根据输入的文件列表进行三种操作:打包(archive)、解包(extract)、直接复制目录结构(pass-through)。

1.用cpio打包目录

1
find /data/app -type f | cpio -ocv > app.cpio

含义:

find → 输出文件列表
      ↓
cpio -o 读取列表并打包
      ↓
生成 app.cpio

参数说明:

  • -o:创建归档
  • -c:使用可移植格式
  • -v:显示过程

2.解包文件

1
cpio -idmv < app.cpio

参数:

  • -i 解包
  • -d 自动创建目录
  • -m 保留时间
  • -v 显示过程

3.高效复制目录

cp -r 更可靠,能保留权限和结构:

1
find /data/app | cpio -pdm /backup/app

含义:

  • -p:pass-through 模式(直接复制)
  • -d:创建目录
  • -m:保留时间

这招经常用于:

  • 容器目录迁移
  • chroot/rootfs 制作
  • 线上热备目录复制

4.加入 xargs 的实战场景

当文件数量极大时,一次传给 cpio 可能过多,这时用 xargs 分批:

1
find /data/app -print0 | xargs -0 -n 1000 cpio -pdm /backup/app

解释:

find        → 输出文件
-print0     → 防止空格断裂
xargs -0    → 正确解析
-n 1000     → 每批1000个
cpio        → 分批复制

适合:

  • 百万级文件目录迁移
  • inode 爆炸目录复制
  • NAS → 本地迁移

5.生产环境常见技巧

1)避免空格问题(强烈推荐)

1
find . -print0 | cpio -o0 > backup.cpio

或:

1
find . -print0 | xargs -0 ...

2)跨机器复制(SSH 管道)

这在运维里非常常见:

1
find /data | cpio -o | ssh host2 "cd /backup && cpio -idmv"

效果:

服务器A        网络        服务器B
find → cpio → ssh → cpio 解包

无需中间文件,速度快。