首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用cpio递归复制目录?

如何使用cpio递归复制目录?
EN

Unix & Linux用户
提问于 2018-11-11 10:17:07
回答 2查看 2.7K关注 0票数 1

如何递归地复制my-files-to-copy.txt列表中的目录?

代码语言:javascript
复制
cd my/source/dir
cpio --create < my-files-to-copy.txt | (cd my/dest/dir && cpio --extract)

my-files-to-copy.txt

代码语言:javascript
复制
src/main.js
src/routes/index.js
src/my-app/ # a directory with it's own child tree I want to recursively copy
EN

回答 2

Unix & Linux用户

发布于 2018-11-11 14:26:27

恐怕cpio不能真正做到这一点,除非您做一些额外的脚本来检测目录路径名并遍历它来提取它下面所有文件的路径名,作为“预处理”列表文件的一种方式。

使用另一个工具(如rsync )要容易得多(请注意--files-from之后的额外-r!):

代码语言:javascript
复制
rsync -a --files-from=my-files-to-copy.txt -r my/source/dir my/dest/dir

..。或pax (标准实用程序):

代码语言:javascript
复制
( cd my/source/dir && pax -w ) <my-files-to-copy.txt |
( cd my/dest/dir   && pax -r )

..。或者使用pax,如果您可以为目标目录提供一个绝对路径:

代码语言:javascript
复制
( cd my/source/dir && pax -rw /my/dest/dir ) <my-files-to-copy.txt

..。或BSD tar (使用-T--files-from=代替-I和GNU tar):

代码语言:javascript
复制
tar -c -f - -C my/source/dir -I my-files-to-copy.txt |
tar -x -f - -C my/dest/dir

这都是假设my-files-to-copy.txt驻留在当前目录中,并且这个目录可能与my/source/dir目录不同。

票数 1
EN

Unix & Linux用户

发布于 2018-11-11 14:52:06

正如前面在注释中提到的,cpio支持您喜欢的东西。例如:

代码语言:javascript
复制
find src/main.js src/routes/index.js src/my-app/ | cpio -pdm my/dest/dir

该方法的缺陷在于,您需要以一种不会加快速度的方式运行两个进程,因为find需要stat(2)所有文件,而cpio也需要在一段时间后使用stat(2) all文件,cpio只使用单个进程来完成实际的复制。

...or --您可以使用我自己的工具star (最古老的免费tar实现)来实现它:

代码语言:javascript
复制
star -copy -p -find src/main.js src/routes/index.js src/my-app/ my/dest/dir

这是有效的,因为starstar进程中使用libfind,每个文件只需要调用stat(2)一次,并将创建新文件的第二个进程分叉到读取文件的主star进程。

为了避免这种方法的速度减慢,两个star进程都通过共享内存共享文件内容和文件元数据。

顺便说一句:当然,您可以将我示例中的文件列表替换为以下内容:

代码语言:javascript
复制
` cat my-file-list.txt ` 
票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/481070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档