如何递归复制列表中的目录my-files-to-copy.txt
?
cd my/source/dir
cpio --create < my-files-to-copy.txt | (cd my/dest/dir && cpio --extract)
我要复制的文件.txt
src/main.js
src/routes/index.js
src/my-app/ # a directory with it's own child tree I want to recursively copy
答案1
恐怕cpio
无法真正做到这一点,除非您执行一些额外的脚本来检测目录路径名并遍历它以提取其下面的所有文件的路径名,作为“预处理”列表文件的一种方式。
使用其他工具会容易得多,例如(请注意后面的rsync
额外内容!):-r
--files-from
rsync -a --files-from=my-files-to-copy.txt -r my/source/dir my/dest/dir
... 或者pax
(标准实用程序):
( cd my/source/dir && pax -w ) <my-files-to-copy.txt |
( cd my/dest/dir && pax -r )
...或者pax
如果您可以给出目标目录的绝对路径:
( cd my/source/dir && pax -rw /my/dest/dir ) <my-files-to-copy.txt
...或 BSD tar
(使用-T
或--files-from=
代替-I
GNU tar
):
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
。
答案2
正如前面评论中提到的,cpio
支持你喜欢的。使用例如:
find src/main.js src/routes/index.js src/my-app/ | cpio -pdm my/dest/dir
这种方法的缺陷是您需要以一种不会加快速度的方式运行两个进程,因为find
需要stat(2)
所有文件,并且cpio
也需要stat(2)
在一段时间后所有文件,并且cpio
只使用一个进程进行实际的复制。
...或者您可以使用我自己的工具以最有效的方式完成此操作star
(最古老的免费 tar 实现):
star -copy -p -find src/main.js src/routes/index.js src/my-app/ my/dest/dir
这是高效的,因为在进程中star
使用时,每个文件只需要调用一次,并派生第二个进程,该进程与读取文件的主进程同时创建新文件。libfind
star
stat(2)
star
为了避免此方法变慢,两个star
进程通过共享内存共享文件内容和文件元数据。
顺便说一句:您当然可以将我的示例中的文件列表替换为以下内容:
` cat my-file-list.txt `