Move o arquivo mais antigo via cron

2

Eu tenho dois diretórios.

/application/inbox
/application/unresponsive

O aplicativo procura arquivos * .txt na caixa de entrada e trabalha com eles. Periodicamente, o aplicativo salvará entradas desses arquivos em arquivos nomeados pela data (2009-07-31) na pasta que não responde.

Gostaria de configurar uma tarefa do cron que funcione uma vez por dia para mover o arquivo mais antigo da caixa que não responde para a caixa de entrada, adicionando uma extensão * .txt para que ele seja selecionado pelo aplicativo.

    
por joebert 02.08.2009 / 23:38

2 respostas

7

Não testado, provavelmente com bugs:

#!/bin/sh

# last file in list sorted newest->oldest
OLDEST=$(ls -t /application/unresponsive | tail -1)

# make sure $OLDEST isn't empty string
if [ -n $OLDEST ]; then
    # quote in case of spaces and remove directory name
    mv "$OLDEST" /application/inbox/$(basename "$OLDEST").txt
fi
    
por 02.08.2009 / 23:44
2

Se você quiser trabalhar com arquivos com espaços (mais robustos). Você deve fazer um loop sobre eles e usar o operador de comparação -nt (mais recente baseado no tempo modificado) ou -ot (mais antigo) com um algoritmo básico min / max. Aqui está um exemplo deste excelente BashFAQ :

files=(*) newest=${f[0]}
for f in "${files[@]}"; do
  if [[ $f -nt $newest ]]; then
    newest=$f
  fi
done

Então, seu exemplo seria (não testado):

files=(/application/inbox/*) oldest=${f[0]}
for f in "${files[@]}"; do
  if [[ $f -ot $oldest ]]; then
    oldest=$f
  fi
mv "$oldest" /application/unresponsive/
done

Aprender como não usar a saída de ls é melhor, eu acho. Aqui está o link para o argumento porque. Mas eu deixo para você decidir se isso é verdade ou apenas um absurdo pseudo-unix-guru: -)

    
por 03.08.2009 / 01:41