递归复制带有剥离前缀的文件

时间:2016-05-02 10:29:24

标签: linux shell recursion cp

我试图创建一个GNU Makefile规则,将文件(通过VPATH找到)从一个目录复制到另一个目录,保留其目录结构。

有几种方法可以做到这一点(从cp -r开始)但似乎没有一种方法在make的上下文中工作,其中复制是在目标<中启动的/ em>目录。

E.g。

  cp ../src/foo.c ../src/bar.c .

所有源文件共享一个公共目录(在运行时只有已知),并且应该删除此公共目录。

E.g。

  $ srcdir=../../knurgl
  $ cp ${srcdir}/src/foo.c ${srcdir}/src/bar.c .
  $ find . -type f
  ./src/foo.c
  ./src/bar.c

即使公共目录在运行时已知,它也可以是任意的,甚至包括当前目录.(在这种情况下,操作应该是一个nop)。

这是我试过的:

CP

cp --parent ${srcdir}/src/foo.c ${srcdir}/src/bar.c .

但是当从目标目录调用时,它肯定会拒绝工作(因为它总是会将文件复制到自己身上)。

焦油

tar c ${srcdir}/src/foo.c ${srcdir}/src/bar.c | tar x

这会删除所有相关目录,但保留其余目录(因此我最终使用./knurgl/src/foo.c代替./src/foo.c

--strip-components选项对我没什么帮助,因为我不知道${srcdir}的深度。

2 个答案:

答案 0 :(得分:1)

而不是

cp --parent ${srcdir}/src/foo.c ${srcdir}/src/bar.c .

(这不起作用,因为它不会剥离$srcdir)你可以写

(wd=$PWD; cd $srcdir; cp --parent src/foo.c src/bar.c $wd)

答案 1 :(得分:0)

make具有用于处理字符串的内置函数。要使用变量old_base_dir中的new_base_dir替换path,请致电:

$(path:old_base_dir/%=new_base_dir/%)

您也可以让它在列表中执行替换:

$(foreach path,$(path_list),$(path:old_base_dir/%=new_base_dir/%)

此处,变量path_list包含多个文件。请注意,如果文件名包含空格,则会中断。

enter image description here描述了更多有用的功能。