Как удалить 3-дневные файлы с помощью ftp в сценарии оболочки (ОС Solaris) - PullRequest
2 голосов
/ 28 января 2010

Я работаю над сценарием для создания файлов, в основном, копий некоторых таблиц и передачи этих файлов на удаленный компьютер. Есть еще одно требование, чтобы удалить старые 3-дневные файлы на удаленном компьютере, прежде чем создавать дамп этих файлов.

Мне нужна помощь в написании ksh для удаления 3-дневных файлов на удаленном компьютере с использованием ftp

1 Ответ

3 голосов
/ 28 января 2010

Обычно вы используете:

find . -mtime +3 -exec rm {} ';'

или что-то подобное (т. Е. Могут быть другие ограничивающие предложения, такие как -type f для обычных файлов или -maxdepth 0 только для текущего каталога, без подкаталогов). -mtime +3 получает только те файлы, дата модификации которых составляет 3 дня или более.

Выполните man find в вашей системе для получения полной информации. Имеет ли Solaris те же функции, что и GNU, я не знаю. Это может быть более ограниченным (или лучше).


Обновление: Пожалуйста, во имя тех богов, которым вы поклоняетесь, пожалуйста, сначала проверьте команду с echo вместо rm. Я не несу ответственности за уничтожение ваших файлов, если вы доверяете совету «какого-то случайного парня в сети, который может иметь или не иметь ваших интересов в глубине души»: -)


И, прежде чем кто-то запрыгнет и ругает меня за то, что я не использую xargs (или, что еще лучше, find -print0 с xargs -0, где доступно), я знаю. Но это не относится к конкретному вопросу под рукой. ОП может задать другой вопрос, если и когда производительность find -exec является проблемой.


Если у вас есть определенный формат файла с датой в нем (как вы указали в своем комментарии), вы можете фактически использовать mdel в ftp. Рассмотрим следующий скрипт:

# The prefix and suffix of files to delete.
prefix='*_'
suffix='-i.tbl'

# Create FTP script file.
rm -rf temp.ftp
echo "user pax pax_password" >>temp.ftp
echo "cd /my/directory" >>temp.ftp
echo "prompt" >>temp.ftp

# Get current date.
y=$(date +%Y)
m=$(date +%m)
d=$(date +%d)
((lasty = y - 1))
((lastm = m - 1))

# If past Jan 3, delete all of previous year.
if [[ $m -gt 1 || $d -gt 3 ]] ; then
    echo "mdel ${prefix}${lasty}????${suffix}" >>temp.ftp
fi

# If past Jan and past the third, delete all of previous month.
if [[ $m -gt 1 && $d -gt 3 ]] ; then
    if [[ ${lastm} -lt 10 ]] ; then
        echo "mdel ${prefix}${y}0${lastm}??${suffix}" >>temp.ftp
    else
        echo "mdel ${prefix}${y}${lastm}??${suffix}" >>temp.ftp
    fi
fi

# If past the third, delete current month more than three days old.
if [[ $d -gt 3 ]] ; then
    ((d = d - 3))
    if [[ ${m} -lt 10 ]] ; then
        m="0${m}"
    fi
    while [[ ${d} -gt 0 ]] ; do
        if [[ ${d} -lt 10 ]] ; then
            echo "mdel ${prefix}${y}${m}0${d}${suffix}" >>temp.ftp
        else
            echo "mdel ${prefix}${y}${m}${d}${suffix}" >>temp.ftp
        fi
        ((d = d - 1))
    done
fi

# Finalise script and run it.
echo "bye" >>temp.ftp
ftp -n mymachine.com <temp.ftp
rm -rf temp.ftp

Кроме небольшого раздражения, когда у вас может оставаться до шести дней файлов на границах месяца, это делает то, что вам нужно. Конечно, вы могли бы сделать код, обрабатывающий границы месяца, немного более разумным, если это действительно важно.

Просто запускайте этот скрипт на своем ящике каждый день, и он будет очищать файлы на целевом ящике с помощью стандартного инструмента ftp. Я все еще думаю, что проще запустить find на сервере, но я представлю эту опцию, если этот путь недоступен.

...