假设我有一个名为 my-project/ 的项目,它位于它自己的目录中并具有以下文件结构。
我的项目/.
├── src
│ ├── index.html
│ ├── main.js
│ ├── normalize.js
│ ├── routes
│ │ ├── index.js
│ │ └── Home
│ │ ├── index.js
│ │ └── assets
│ ├── static
│ ├── store
│ │ ├── createStore.js
│ │ └── reducers.js
│ └── styles
└── project.config.js
现在假设我有一个名为 my-new-project 的新项目,它也位于它自己的目录中,并且具有与 my-project 相同的文件结构,但它包含一个名为 my-files-to-copy.txt 的附加文件
我的新项目/.
├── src
│ ├── index.html
│ ├── main.js
│ ├── normalize.js
│ ├── routes
│ │ ├── index.js
│ │ └── Home
│ │ ├── index.js
│ │ └── assets
│ ├── static
│ ├── store
│ │ ├── createStore.js
│ │ └── reducers.js
│ └── styles
├── project.config.js
└── my-files-to-copy.txt # new file added to tree
my-new-project/ 与 my-project/ 具有相同的文件结构,但文件内容不同
现在假设 my-files-to-copy.txt 包含我想要从 my-project/ 复制并写入 my-new-project/ 中相同路径的文件列表,以覆盖 my-new-project 中的现有文件/ 在那些地点。
我要复制的文件.txtsrc/main.js
src/routes/index.js
src/store/reducers.js
project.config.js
如何使用终端/bash/shell 命令或脚本来完成此操作?
我想我也许能够做到:
cp my-project/src/main.js my-new-project/src/main.js
cp my-project/src/routes/index.js my-new-project/src/routes/index.js
cp my-project/src/store/reducers.js my-new-project/src/store/reducers.js
cp my-project/project.config.js my-new-project/project.config.js
也许某种类型的rsync
命令可以?
但随着文件数量的增加,这种方法的效率将会降低。我正在寻找一种更有效的解决方案,它允许我利用包含文件列表(或至少一个脚本)的文件,而不必为每个文件编写单独的命令。
答案1
这就是cpio
:复制文件列表。我总是发现“in”和“out”方向令人困惑,很高兴 GNU 有--create
和--extract
。
cd your/source/dir
cpio --create < my-files-to-copy.txt | (cd your/dest/dir && cpio --extract)
有很多选项可以用来cpio
管理诸如保留所有权/时间戳之类的事情。手册页将指导您。需要了解的一个大问题是cpio
不会创建目录,除非您 (a) 将它们复制到流中(例如,在要复制的文件列表中)或 (b) 使用--make-directories
提取端的选项。