Задание Cron для перемещения каталогов старше 24 часов

Ну, то, что я хочу сделать, это

  1. Крон должен запускаться каждый час или около того
  2. Он должен переместить каталоги в папке /disk1/data/ старше 24 часов в /disk2/data/
  3. Перемещаемые каталоги должны содержать все данные (файлы / папки) внутри них

Я новичок в работе cron, поэтому я абсолютно не знаю, с чего начать. Спасибо за любую помощь!

2 ответа

Что именно вы подразумеваете под возрастом каталога? Время с момента создания своего инода? Я предлагаю вам использовать find определить каталоги, которые вы хотите переместить. Например, вот так:

#!/bin/bash
res=0
cd /disk1/data/
find -type d -ctime +1 -print0 -prune | \
while IFS= read -r -d '' i; do
    if [[ ${i} == */* ]]; then                    # need to ensure subdir exists
        if ! mkdir -p "/disk2/data/${i%/*}; then  # error creating dir?
            res=1
            continue
        fi
    fi
    rm -rf "/disk2/data/${i}"                     # make sure target does not exist
    mv "${i}" "/disk2/data/${i}"                  # move stuff
done
exit ${res}

Если бы другим людям было разрешено писать disk2, тогда этот код может быть уязвим для некоторых видов атак по символическим ссылкам, если кто-то создает правильные символические ссылки достаточно быстро. Точно сказать не могу.

Я предлагаю вам написать скрипт в какой-нибудь файл и выполнить его из cronjob. Вы создаете конобу с crontab -e (убедитесь, что вы установили свой EDITOR переменная среды), следуя формату, описанному в man crontab,

Обратите внимание, что -ctime вариант find не означает время создания, но "время смены инода". Поле st_ctime изменяется путем записи или путем установки информации об узле (владелец, группа, количество ссылок, режим и т. д.). Для каталогов это также будет отражать последний раз, когда файл (или подкаталог) был создан или удален в этом каталоге. Итак, рассмотрим ли find -type d -ctime +1 действительно вариант, который вам требуется.

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