Como copiar somente um arquivo (o mais novo) de um diretório usando um script de shell no Mac OS X?

0

Estou procurando executar periodicamente um script que copie somente o arquivo editado mais recentemente de um diretório para outro. Como faço isso com um script de shell no OSX?

    
por blueberryfields 15.05.2013 / 01:47

1 resposta

4

A maneira mais fácil seria fazer isso diretamente através de cron . Por exemplo, para copiar o arquivo uma vez por semana, crie um crontab assim:

@weekly cp "$(ls -t /path/to/source | head -1)" /path/to/target

DETALHES:

O sinal -t de ls significa classificar por hora, portanto, imprimindo apenas o primeiro arquivo ( head -1 ), sei que estou obtendo o mais novo. A execução de ls -t /path/to/source | head -1 retornará o arquivo mais recente no diretório /path/to/source , então cp "$(ls -t /path/to/source | head -1)" /path/to/target copiará o arquivo mais recente de source para target . As aspas ao redor da expressão são necessárias para lidar com nomes de arquivos que contenham espaços.

Wikipedia explica que

Cron is the time-based job scheduler in Unix-like computer operating systems. Cron enables users to schedule jobs (commands or shell scripts) to run periodically at certain times or dates. It is commonly used to automate system maintenance or administration.

[...]

Cron is driven by a crontab (cron table) file, a configuration file that specifies shell commands to run periodically on a given schedule.

Para criar um novo crontab, abra um terminal e execute

crontab -e

Isso iniciará seu editor padrão ( $EDITOR ) e apresentará um arquivo de texto. Cole a linha acima nesse arquivo, salve e saia e pronto, seu crontab foi criado.

O formato do crontabs é (tirado de aqui ):

*     *     *     *     *  command to be executed
-     -     -     -     -
|     |     |     |     |
|     |     |     |     +----- day of week (0 - 6) (Sunday=0)
|     |     |     +------- month (1 - 12)
|     |     +--------- day of month (1 - 31)
|     +----------- hour (0 - 23)
+------------- min (0 - 59)

Então, por exemplo, para executar cp /foo /bar às 14:35 de 12 de outubro, você escreveria:

35    14   12      11    cp /foo /bar

O daemon cron também entende alguns comandos abreviados, como:

       string          meaning
       ------          -------
       @reboot         Run once, at startup.
       @yearly         Run once a year, "0 0 1 1 *".
       @annually       (same as @yearly)
       @monthly        Run once a month, "0 0 1 * *".
       @weekly         Run once a week, "0 0 * * 0".
       @daily          Run once a day, "0 0 * * *".
       @midnight       (same as @daily)
       @hourly         Run once an hour, "0 * * * *".

Assim, o crontab que eu dei acima significa que o comando cp é executado uma vez por semana à meia-noite do domingo de manhã.

    
por 15.05.2013 / 02:08

Tags