Limpando os arquivos de ontem via script

2

Gostaria de executar um cronjob que fosse executado todas as manhãs para mover os arquivos que foram criados no dia anterior em um diretório específico para serem movidos para uma pasta que foi criada com o título de datas anterior.

Por exemplo, o Motion cria uma série de arquivos jpg em um diretório chamado instantâneos. Eu gostaria de ter o script executado e encontrar todos os arquivos que foram criados ontem no diretório de snapshots (incluindo os arquivos avi que ele criou), e movê-los para uma pasta com a data de ontem como título.

Alguém já tentou isso antes? O movimento já tem essa funcionalidade incorporada e eu simplesmente não estou vendo isso?

O próximo passo será fazer com que o auto seja limpo automaticamente após 7-14 dias, mas isso é um outro post completo.

    
por Nosaj Karotep 18.06.2014 / 20:09

2 respostas

4

Isso é feito de forma muito simples através de find . As opções relevantes são:

   -mtime n
          File's data was last modified n*24 hours ago.  See the  comments
          for -atime to understand how rounding affects the interpretation
          of file modification times.
   -atime n
          File was last accessed n*24 hours ago.  When  find  figures  out
          how  many  24-hour  periods  ago the file was last accessed, any
          fractional part is ignored, so to match -atime +1, a file has to
          have been accessed at least two days ago.
   -exec command ;
          Execute  command;  true  if 0 status is returned.  All following
          arguments to find are taken to be arguments to the command until
          an  argument  consisting of ';' is encountered.  The string '{}'
          is replaced by the current file name being processed  everywhere
          it occurs in the arguments to the command, not just in arguments
          where it is alone, as in some versions of find.  Both  of  these
          constructions might need to be escaped (with a '\') or quoted to
          protect them from expansion by the shell.  

Portanto, para mover todos os arquivos jpg criados no diretório snapshots nas últimas 24 horas, você executaria

find /home/yourusername/snapshots/ -name '*jpg' -mtime +0 -exec mv {} /path/to/dest

O {} é substituído por cada nome de arquivo encontrado. As cotas não são necessárias, pois find lida com nomes de arquivos estranhos antes de executar o comando. O +0 significa "o arquivo foi modificado pela última vez pelo menos 1 * 24 horas atrás, como explicado na seção atime citada acima.

Se você quiser movê-los para um diretório cujo nome é a data de ontem, você teria que criá-lo (usando a opção -p , então mkdir não reclamará se o diretório existir):

mkdir -p $(date -d yesterday +%F)

O comando date imprimirá a data de ontem no formato YYYY-MM-DD . Por exemplo, 2014-06-18. Você pode combinar os dois comandos na mesma find -exec call (o \ após -mtime está lá apenas para legibilidade, ele permite que você quebre um comando em várias linhas):

find /home/yourusername/snapshots/ -name '*jpg' -mtime +0 \
 -exec bash -c "mkdir -p $(date -d yesterday +%F) && mv {} $(date -d yesterday +%F)" \;

Portanto, para executar isso com cron , você poderia adicionar uma linha como essa ao seu crontab (run crontab -e ):

0 9 * * * find /home/yourusername/snapshots/ -name '*jpg' -mtime +0 -exec bash -c "mkdir -p $(date -d yesterday +%F) && mv {} $(date -d yesterday +%F)" \;

O exemplo acima executaria o comando find todos os dias às 9:00.

    
por terdon 19.06.2014 / 14:48
3
find /path/to/my/folder/ -type f -mtime -1 -exec ls -l "{}" \;

Se você quiser movê-los, poderá alterar o comando exec:

find /path/to/my/folder/ -type f -mtime -1 -exec mv "{}" /path/to/my/newfolder/ \;

"{}" é o caminho completo para cada nome de arquivo que correspondeu à pesquisa.

O \; é necessário no final da linha de comando.

Você pode excluí-los usando -delete :

find /path/to/my/folder/ -type f -mtime -1 -delete
    
por Savvas Radevic 18.06.2014 / 20:25