我正在创建一个Makefile,将输出文件(foo.o
)移动到另一个目录(baz
)。
输出文件根据需要移动到目录。但是,如果再次键入make
,make将不会重新编译输出文件,mv
在尝试将不存在的空文件移动到目录baz
时会收到错误。
所以这是我在所有编译后在我的规则make all
中定义的内容:
-test -e "foo.o" || mv -f foo.o ../baz
不幸的是,我仍然遇到错误。
答案 0 :(得分:102)
答案 1 :(得分:31)
我注意到没有人真正回答了原来的问题本身,特别是如何忽略错误(目前所有答案都只关注调用命令,如果它不会导致错误)。
要实际忽略错误,您只需执行以下操作:
mv -f foo.o ../baz 2>/dev/null; true
这会将stderr
输出重定向到null
,并按照命令true
(始终返回0
,导致make认为命令成功,而不管实际是什么发生了),允许程序流程继续。
答案 2 :(得分:9)
+@[ -d $(dir $@) ] || mkdir -p $(dir $@)
是我用来静默创建文件夹(如果它不存在)。对于你的问题,这样的事情应该起作用
-@[ -e "foo.o" ] && mv -f foo.o ../baz
答案 3 :(得分:1)
-test -e "foo.o" || if [ -f foo.o ]; then mv -f foo.o ../baz; fi;
那应该有用
答案 4 :(得分:0)
像
这样的东西test -e "foo.o" && mv -f foo.o ../baz
应该有效:运营商应该是&&
而不是||
。
您可以尝试以下命令进行试验:
test -e testfile && echo "going to move the file"
test -e testfile || echo "going to move the file"
答案 5 :(得分:0)
我遇到了同样的问题,当我生成文件时,它们总是有不同的时间。解决方法是将文件设置为同一时间: touch -d '1 June 2018 11:02' file。在这种情况下,gzip 生成相同的输出和相同的 md5sum。在我的场景中,我不需要时间来处理文件。