Очистка вчерашних файлов с помощью скрипта

Я хотел бы запустить cronjob, который запускался каждое утро, чтобы переместить файлы, которые были созданы в предыдущий день, в определенный каталог для перемещения в папку, которая была создана с заголовком предыдущих дат.

Например, Motion создает серию файлов jpg в каталоге, называемом снимками. Я хотел бы запустить скрипт и найти все файлы, созданные вчера, в каталоге моментальных снимков (включая созданные им avi-файлы) и переместить их в папку с заголовком вчерашней даты.

Кто-нибудь пробовал это раньше? У движка уже есть эта функциональность, а я ее просто не вижу?

Следующим шагом будет автоматическая очистка через 7-14 дней, но это совсем другой пост.

3
задан 18 June 2014 в 22:14

2 ответа

Это очень просто сделано через find. Соответствующие опции:

   -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.  

Так, для перемещения всех jpg файлы, созданные в snapshots каталог за прошлые 24 часа, Вы работали бы

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

{} заменяется каждым найденным именем файла. Кавычки не необходимы с тех пор find соглашения со странными именами файлов корректно прежде, чем выполнить команду. +0 означает, что "файл был в последний раз изменен по крайней мере 1*24 ч назад, как объяснено в atime раздел, заключенный в кавычки выше.

Если Вы хотите переместить их в каталог, имя которого является вчерашней датой, необходимо было бы создать его (использование -p опция так mkdir не жалуется, существует ли каталог):

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

date команда распечатает вчерашнюю дату в YYYY-MM-DD формат. Например, 18.06.2014. Можно объединить две команды в то же find -exec звоните ( \ после -mtime только там для удобочитаемости, она позволяет Вам повреждать команду в несколько строк):

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

Так, для выполнения этого с cron, Вы могли добавить строку как это к Вашему crontab (выполненный 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)" \;

Вышеупомянутое работало бы find управляйте каждый день в 9:00.

5
ответ дан 18 June 2014 в 22:14
find /path/to/my/folder/ -type f -mtime -1 -exec ls -l "{}" \;

, Если Вы хотите переместить их, можно изменить исполнительную команду:

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

"{}" полный путь к каждому имени файла, которое соответствовало поиску.

Эти \; требуется в конце командной строки.

можно удалить их использующий -delete:

find /path/to/my/folder/ -type f -mtime -1 -delete
3
ответ дан 18 June 2014 в 22:14

Другие вопросы по тегам:

Похожие вопросы: