如何使用 cp 重复正确地将一个目录复制到新名称?
我正在写一个makefile。然而,除了路径扩展和我能做的事情的限制之外,这基本上是一个 shell 脚本问题。作为 make 过程的一部分,我想将目录复制到目标。我的源目录和目标目录是变量,所以我不能对它们做太多假设。他们可能是完全合格的,也可能是相对的。
但我想将目录 $(A) 复制到目标 $(B)。 $(B) 是我希望目录在目标位置具有的名称,而不是我想要将 $(A) 复制到的目录(即生成的目录名称将是 $(B),而不是 $(A)/$( B)),源和目标的路径可能相同,因此我在执行任何操作之前检查 ifneq ($(A),$(B))。但问题是,我在街区里做什么?
如果我执行
cp -r $(A) $(B)
,
它将第一次工作。 $(A) 被复制到 $(B)。但如果稍后再次触发该规则,它将在 $(B) 内创建 $(A) 的新副本(即 $(B)/$(A))。
在你问之前,如果可能的话,我宁愿在这样做之前不rm -r $(B)
。
I am writing a makefile. However except for the path expansion and restrictions on what I can do, this is basically a shell scripting question. As part of the make process, I want to copy a directory to the destination. My source directory and destination directory are variables, so I can't assume a lot about them. They may be fully qualified, they may be relative.
But I want to copy the directory $(A) to the destination $(B). $(B) is the name I want the directory to have at the destination, not the directory I want to copy $(A) to (i.e. the resulting directory name will be $(B), not $(A)/$(B)), it might be the same path for source and dest, so I check with an ifneq ($(A),$(B)) before doing anything. But the question is, what do I do in the block.
If I do
cp -r $(A) $(B)
it will work the first time. $(A) is copied to $(B). But if the rule triggers again later, it will make a new copy of $(A) inside $(B) (i.e. $(B)/$(A)).
And before you ask, I'd rather not rm -r $(B)
before doing this if at all possible.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
cp -r $(A)/ $(B)
添加斜杠会将 $(A) 的内容复制到 $(B) 中,如果 $(B) 不存在则创建它。
cp -r $(A)/ $(B)
Adding the slash will copy the contents of $(A) into $(B), and create $(B) if it does not exist.
如果您使用的是 GNU
cp
,您可以这样做:您也可以尝试
rsync
:If you're using GNU
cp
, you can do:You can also try
rsync
:第一次使用
cp -r $(A) $(B)
怎么样,然后仅在以下情况下使用copy
的-u
进行复制:来源比目的地新?有关更多信息,请参阅 cp 的手册页。how about using
cp -r $(A) $(B)
for the first time, then use-u
ofcopy
to copy only when source is newer than destination?? see man page ofcp
for more.使用 rsync 代替 cp
Instead of cp, use rsync