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

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

如何递归复制列表中的目录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=代替-IGNU 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使用时,每个文件只需要调用一次,并派生第二个进程,该进程与读取文件的主进程同时创建新文件。libfindstarstat(2)star

为了避免此方法变慢,两个star进程通过共享内存共享文件内容和文件元数据。

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

` cat my-file-list.txt ` 

相关内容