単純なシェルスクリプトがあります。私がしたいのはファイルをにコピーすることですが/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
*.MIX
パターンと一緒にrsyncを使用できます*.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