制作

制作

我有一个简单的 shell 脚本。我想做的是将文件复制到/home/imp/imp/msgs//home/imp/imp/msgs/bak/但前提是它们在源目录中比目标目录中新。

#!/bin/bash
cp /home/imp/imp/msgs/*.MIX /home/imp/imp/msgs/bak/
cp /home/imp/imp/msgs/*.BRD /home/imp/imp/msgs/bak/

我尝试过cp -u,但它似乎对我不起作用。

答案1

您可以将 rsync 与模式*.MIX和 一起使用*.BRD,例如

rsync -avm --include='*.MIX' --include='*.BRD' --exclude='*' /home/imp/imp/msgs/ /home/imp/imp/msgs/bak/

答案2

您需要使用cp -p保留时间戳。否则你下次就无法对它们进行有用的比较。

cp -pu /home/imp/imp/msgs/*.MIX /home/imp/imp/msgs/bak/
cp -pu /home/imp/imp/msgs/*.BRD /home/imp/imp/msgs/bak/

答案3

制作

这里我们使用heredoc动态生成Makefile并运行动态Makefile来完成copy

cat - <<\CODE | make -f - SRCDIR="/home/imp/imp/msgs" XN="BRD MIX"
.PHONY: all
all: $(foreach i,$(foreach j,$(XN),$(wildcard $(SRCDIR)/*.$j)),$(addprefix $(join $(dir $i),bak/),$(notdir $i)))
cprule = $(SRCDIR)/bak/%.$1: $(SRCDIR)/%.$1; /bin/cp -p "$$^" "$$@"
$(foreach i,$(XN),$(eval $(call cprule,$i)))
CODE

重击

SRCDIR="/home/imp/imp/msgs"
for src in "$SRCDIR"/*.MIX "$SRCDIR"/*.BRD
do
   dest=${src%/*}/bak/${src##*/}
   if [ ! -e "$dest" ] || [ "$src" -nt "$dest" ]
   then
      /bin/cp -p "$src" "$dest"
   fi
done

相关内容