만들다

만들다

간단한 쉘 스크립트가 있습니다. 내가 하고 싶은 것은 파일을 에 복사하는 것이지만 /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

관련 정보