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.