Como executar um script assim que o número da semana mudar?

2

Gostaria de manter minha pasta de downloads ordenada. Meu objetivo é ter os arquivos da semana atual na pasta de download e os arquivos mais antigos em uma pasta com o nome do número da semana e ano (por exemplo, 2013.09, lexicograficamente ordenável) da data de criação desses arquivos.

Eu só quero que isso se aplique aos arquivos e pastas encontrados na raiz da pasta de download; tar archives e outros arquivos são, às vezes, automaticamente expandidos pelo navegador quando o download é concluído.

Presume-se que os arquivos e pastas atualmente na raiz da pasta de download sejam os da semana atual. No entanto, o mtime e o ctime não informam quando o arquivo realmente terminou o download.

Se a máquina estivesse sempre ligada, eu poderia configurar uma tarefa Cron para ser executada assim que o número da semana fosse alterado, mas este é um laptop, e eu o coloco em modo de espera quando não o uso.

    
por alecail 25.10.2013 / 10:43

1 resposta

3

Defina o crontab como:

@reboot the-script
0 0 * * 1 the-script
0 0 1 1 * the-script

Para que seja feito às segundas e a cada inicialização. E em the-script , verifique se já foi feito. (se estiver usando o %W para o número da semana, você também precisa fazê-lo no dia 1º de janeiro (obrigado Gilles), não se estiver usando o número da semana ISO 8061 (% V)).

Se o seu cron não for compatível com @reboot , você deverá adicioná-lo a um script de inicialização.

Ou apenas execute-o diariamente e faça algo como (assumindo GNU find , portanto não OS / X, embora você possa usar OS / X stat em combinação com -exec ... {} + .

 cd ~/Download || exit
 find . -path './20[0-9][0-9].[0-9]*' -prune -o -type f -mtime +7 -printf '%p
zmodload zsh/stat
cd ~/Download || exit
for f (**/*~20[0-9][0-9].[0-9]*(.DNm+7)) {
  zstat -A d -F %Y.%W -- $f &&
    mkdir -p $d &&
    mv -i -- $f $d
}
%TY.%TW
zmodload zsh/stat
cd ~/Download || exit
for f (*(.DNm+7)) {
  zstat -A d -F %Y.%W -- $f &&
    mkdir -p $d &&
    mv -i -- $f $d
}
' | xargs -r0n2 sh -c 'mkdir -p "$2" && exec mv -i "$@"' sh

(não testado)

Ou com zsh :

find . -type f -maxdepth 1 -Btime +7 \
  -exec stat -nf%SB -t%Y.%W {} \; \
  -exec printf '
@reboot the-script
0 0 * * 1 the-script
0 0 1 1 * the-script
' \; \ -print0 | xargs -0n2 sh -c ' mkdir -p "$1" && mv -i "$2" "$1"' sh

Se você não quiser recursivamente, é mais simples:

 cd ~/Download || exit
 find . -path './20[0-9][0-9].[0-9]*' -prune -o -type f -mtime +7 -printf '%p
zmodload zsh/stat
cd ~/Download || exit
for f (**/*~20[0-9][0-9].[0-9]*(.DNm+7)) {
  zstat -A d -F %Y.%W -- $f &&
    mkdir -p $d &&
    mv -i -- $f $d
}
%TY.%TW
zmodload zsh/stat
cd ~/Download || exit
for f (*(.DNm+7)) {
  zstat -A d -F %Y.%W -- $f &&
    mkdir -p $d &&
    mv -i -- $f $d
}
' | xargs -r0n2 sh -c 'mkdir -p "$2" && exec mv -i "$@"' sh

Se a hora da última modificação não refletir o horário do download, você poderá usar o horário de nascimento. Desta vez usando OS / X find , stat e xargs (e usando -maxdepth 1 para não recurse):

find . -type f -maxdepth 1 -Btime +7 \
  -exec stat -nf%SB -t%Y.%W {} \; \
  -exec printf '%pre%' \; \
  -print0  | xargs -0n2 sh -c '
  mkdir -p "$1" && mv -i "$2" "$1"' sh
    
por 25.10.2013 / 10:56

Tags