Como copiar todos os dias para outro dos dois destinos?

7

Como fazer isso com o cron?

  • Hoje: cp * ~/destination.0
  • Amanhã: cp * ~/destination.1
  • Dia seguinte: cp * ~/destination.0
  • Dia seguinte: cp * ~/destination.1

... e assim por diante.

Qualquer ajuda seria muito apreciada!

    
por Stefan 01.12.2017 / 13:54

4 respostas

6

Um forro:

0 0 * * * cp /path/to/* /path/to/destination.$(( $(date -d $(date +%F) +%s)/(3600*24) % 2))

Explicação:

$(( $(date -d 0:00 +%s)/(3600*24) % 2))
  • retornará o timestamp em segundos ( +%s ) de hoje às 0:00 ( -d 0:00 ).
  • Dividido por (3600*24) retornará o número de dias da época do unix.
  • %2 retornará 0 ou 1 para dias pares ou ímpares desde o início da época do unix.
por RoVo 01.12.2017 / 14:43
3

Se não houver problema em gravar em ~/destination.0 em datas pares e ~/destination.1 em datas ímpares, a seguinte linha crontab deverá funcionar. Ele inicia o backup à meia-noite (0 min, 0 hora, os dois primeiros itens na linha),

0 0 * * * echo cd dir2copy;dtmp=$(( $(/bin/date '+%d') % 2 ));echo /bin/cp * ~/destination."$dtmp"

Veja este link para uma explicação da sintaxe do crontab,

Agendando tarefas com trabalhos em cronograma

Teste a parte do comando da linha em uma janela de terminal,

echo cd dir2copy;dtmp=$(( $(/bin/date '+%d') % 2 ));echo /bin/cp * ~/destination."$dtmp"

e quando ele funciona, você pode substituir cd dir2copy por cd to-the-actual-directory-you-want-to-copy , substituir ~ por /home/your-home-directory e remover as duas palavras echo para fazer o trabalho real.

Teste novamente e modifique a linha de crontab. (O ambiente no crontab é tal que você pode precisar de caminhos completos explícitos para programas, diretórios e arquivos de dados.)

/bin/date '+%d' encontra o dia do mês e % é a operação restante, que produz um 0 ou 1 , que é anexado no final da linha de comando.

Você pode preferir /bin/date '+%j' , que encontra o dia do ano, por exemplo, hoje, 1º de dezembro, dia #335 .

    
por sudodus 01.12.2017 / 14:49
2

Concordo com as respostas "executar o cronjob diariamente, alternar diretórios no script", mas eu faria assim:

#!/bin/bash 
# use hidden link
last=$HOME/.last_destination
#
declare -a dirs
dirs[0]="destination.0"
dirs[1]="destination.1"
#
target=
#
# If $last is a link, it points to the last used directory. Otherwise,
# initialize it and use $HOME/destination.0
if [[ -L "$last" ]] ; then
    # get the name of the linked dir
    old="$(stat  --printf="%N" "$last" | cut -d\' -f4)"
    if [[ "$old" == "${dirs[0]}" ]] ; then
        target="${dirs[1]}"
    else
        target="${dirs[0]}"
    fi
else
    # "$last" is not a link - first time initialization
    target="${dirs[0]}"
fi
# now, with $target set, point the $last link at $target, for next time
rm "$last"
ln -s "$target" "$last"
#
# debugging printouts - remove in real life
echo "$target"
ls -l "$last"
    
por waltinator 01.12.2017 / 19:22
0

Execute este script diariamente no cron:

#! /bin/sh
set -e
cp * ~/destination.0
mv ~/destination.0 ~/destination.last
mv ~/destination.1 ~/destination.0
mv ~/destination.last ~/destination.0
    
por Luc Moreau 01.12.2017 / 14:39

Tags