Bash

用於將文件列表從一個項目複製到另一個項目的 Shell/終端/bash 命令或腳本

  • November 11, 2018

假設我有一個名為 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 中的現有文件的文件列表/ 在那些位置。

我的文件到copy.txt

src/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命令會做?

但是隨著文件數量的增加,這種方法的效率會降低。我一直在尋找一種更有效的解決方案,它允許我利用包含文件列表(或至少一個腳本)的文件,而無需為每個文件編寫單獨的命令。

這就是cpio:複製文件列表。我總是覺得“輸入”和“輸出”方向令人困惑,並且很高興 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提取端的選項。

引用自:https://unix.stackexchange.com/questions/481036