Copiando apenas arquivos mais recentes

2

Eu tenho um script de shell simples. O que eu gostaria de fazer é copiar os arquivos em /home/imp/imp/msgs/ para /home/imp/imp/msgs/bak/ , mas somente se eles forem mais novos no diretório de origem do que no diretório de destino.

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

Eu tentei cp -u , mas não parece funcionar para mim.

    
por ignatius 20.03.2017 / 05:55

3 respostas

3

Você pode usar o rsync com o padrão *.MIX e *.BRD , por exemplo

rsync -avm --include='*.MIX' --include='*.BRD' --exclude='*' /home/imp/imp/msgs/ /home/imp/imp/msgs/bak/
    
por 20.03.2017 / 06:22
2

Você precisa usar cp -p para reter registros de data e hora. Caso contrário, você não pode compará-los da próxima vez.

cp -pu /home/imp/imp/msgs/*.MIX /home/imp/imp/msgs/bak/
cp -pu /home/imp/imp/msgs/*.BRD /home/imp/imp/msgs/bak/
    
por 20.03.2017 / 20:35
0

Tornar

Aqui nós geramos o Makefile dinamicamente usando um heredoc e rodamos o Makefile dinâmico para realizar o 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

Bash

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
    
por 20.03.2017 / 13:06