如何递归地复制my-files-to-copy.txt列表中的目录?
cd my/source/dir
cpio --create < my-files-to-copy.txt | (cd my/dest/dir && cpio --extract)my-files-to-copy.txt
src/main.js
src/routes/index.js
src/my-app/ # a directory with it's own child tree I want to recursively copy发布于 2018-11-11 14:26:27
恐怕cpio不能真正做到这一点,除非您做一些额外的脚本来检测目录路径名并遍历它来提取它下面所有文件的路径名,作为“预处理”列表文件的一种方式。
使用另一个工具(如rsync )要容易得多(请注意--files-from之后的额外-r!):
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目录不同。
发布于 2018-11-11 14:52:06
正如前面在注释中提到的,cpio支持您喜欢的东西。例如:
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实现)来实现它:
star -copy -p -find src/main.js src/routes/index.js src/my-app/ my/dest/dir这是有效的,因为star在star进程中使用libfind,每个文件只需要调用stat(2)一次,并将创建新文件的第二个进程分叉到读取文件的主star进程。
为了避免这种方法的速度减慢,两个star进程都通过共享内存共享文件内容和文件元数据。
顺便说一句:当然,您可以将我示例中的文件列表替换为以下内容:
` cat my-file-list.txt ` https://unix.stackexchange.com/questions/481070
复制相似问题