Я хотел бы запустить cronjob, который запускался каждое утро, чтобы переместить файлы, которые были созданы в предыдущий день, в определенный каталог для перемещения в папку, которая была создана с заголовком предыдущих дат.
Например, Motion создает серию файлов jpg в каталоге, называемом снимками. Я хотел бы запустить скрипт и найти все файлы, созданные вчера, в каталоге моментальных снимков (включая созданные им avi-файлы) и переместить их в папку с заголовком вчерашней даты.
Кто-нибудь пробовал это раньше? У движка уже есть эта функциональность, а я ее просто не вижу?
Следующим шагом будет автоматическая очистка через 7-14 дней, но это совсем другой пост.
Это очень просто сделано через 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.
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