LINUX.ORG.RU
ФорумAdmin

удалить все файлы кроме последних 70 - скрипт, как?

 , , , ,


0

1
Приветствую!
есть у мну каталог, где копятся логфайлы с расширением .тхт

и копятся они там довольно стремительно - по 6 штук в час.

хотелось бы автоматом удалять все старые, оставляя последние ( свежайшие) 70 штук.
может случится так, что логфайлы создаватся прекратят, и в этом случае также хотелось бы, чтобы последние 70 штук сохранялись неопределённо долго не стираясь.

открыл один старый скрипт вида:

ls -t -r log_fileflow*.txt |head -n -10|xargs rm -rf 2>&1 /BackUp/backuprm.txt

но как то он несколько не так работает, как мне в данном случае хотелось бы...

у кого нибудь нет ли каких идей, что там и как поменять?
про своё днк я в курсе, да :D


 


Вообще-то, для задач, подобных Вашим, придуман специальный механизм - logrotate. Посмотрите его, мне кажется, это всяко гибче и удобнее, чем самопальный скрипт. Да и смысла большого изобретат велосипед нету...

Serge10 ★★★★★
()

Способов можно придумать много.

1. Натравить на эти файлы logrotate или любой другой аналогичный инструмент.

2. Если нужно чтобы работал однострочник из примера выше и он удалял 70 последних файлов, то я поправил бы его так:

ls -1 -r log_fileflow*.txt |head -n -70|xargs rm -rf 2>&1 /BackUp/backuprm.txt

3. Если у тебя реально пишутся логи со скоростью 6 файлов в час то можно сделать однострочник на find примерно такого вида и перенаправить его вывод в какой-то файл:

find $path_2dir_with_garbage -mtime +12H -name «log_fileflow*.txt» -exec rm -v {} \;

Имхо, разумнее всего для этой цели использовать утилиты для ротации логов и не пихать в крон костыли, про которые потом не вспомнить.

charioteer
()
Ответ на: комментарий от Serge10

Сорри, пока редактировал свой ответ уже все по делу написали:)

charioteer
()
Ответ на: комментарий от charioteer

2. Если нужно чтобы работал однострочник из примера выше и он удалял 70 последних файлов, то я поправил бы его так:

надо чтобы он оставлял, а не удалял последние 70 файлов.

вызыватся будет не с крона, а из самого скрипта, который по циклу замкнут.

кстати, xargs rm -rf 2>&1 /BackUp/backuprm.txt- сиё логирование тоже не работает, то есть backuprm.txt даже не создаётся...

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

wisedraco ★★
() автор топика
Ответ на: комментарий от wisedraco

логротейт натравливать нехочу

А это самый правильный вариант. Там очень просто описать в конфиге все условия, которые тебе необходимы. Ещё и всякие дополнительные возможности есть типа архивирования, post-rotate команд и прочего.

shell-script ★★★★★
()
Ответ на: комментарий от wisedraco

кстати, xargs rm -rf 2>&1 /BackUp/backuprm.txt- сиё логирование тоже не работает, то есть backuprm.txt даже не создаётся...

А должен? И что вы в нем увидеть хотели?

anc ★★★★★
()
Ответ на: комментарий от anc

рабочий проверенный скрипт. можт кому пригодитося

#!/bin/bash

cd /PD_nfs/MEOS

echo $(date)

##define variables
address="email@email.com"


#ls -ltr | tail -n1 | awk '{print $8}'
#find /data -type f -mmin 20 -exec stat -c '%Y %n %y' {} + | sort -k1nr | head -1

while true; do
    COUNT=$(find . -mmin -10 -type f | wc -l)
    echo $(pwd);
    echo $(date);
    echo "last file date: " $(ls -ltr | tail -n1 | awk '{print $8}');
    find . -mmin -10 -type f | wc -l ;
timestamp=$(date +%Y%m%d_%H%M%S)
path="/Second"
filename=log_check_flow_$timestamp.txt
log=/Second/$filename
START_TIME=$(date +%s)
END_TIME=$(date +%s)
ELAPSED_TIME=$(expr $END_TIME - $START_TIME)

find . -mmin -10 -type f | wc -l >> $log;
find . -mmin -10 -type f | head -n15 |tee -a $log

echo "find output for 20 minutes :  " >> $log
find . -type f -mmin 20 -exec stat -c '%Y %n %y' {} + | sort -k1nr | head -1 >> $log

echo " " >> $log
echo " ls -ltr output: " >> $log
ls -ltr | tail -n1 | awk '{print $8}' >> $log

#remove old logfiles:
pwd
date >>$path/log_rm.txt;
ls -t -r $path/log_check*.txt |head -n -70 
ls -t -r $path/log_check*.txt |head -n -70 |xargs rm  -rfv >>$path/log_rm.txt;
#ls -t -r $path/log_check*.txt |tail -n +18 |xargs rm  -rfv >$path/log_rm.txt;

echo "remove_old_logfiles pass"

#echo "Backup :: Script End -- $(date +%Y%m%d_%H%M)" >> $log
echo "Checking :: Script End -- $(date +%Y%m%d_%H%M)" >> $log
echo "Elapsed Time ::  $(date -d 00:00:$ELAPSED_TIME +%Hh:%Mm:%Ss) "  >> $log

# check for rm logfile size:

echo "rm_log size now is: "    
du $path/log_rm.txt | cut -f1
    
    if [[ $(du $path/log_rm.txt | cut -f1) -gt 100 ]]; 
    then echo 're-arm log_rm';
    cp $path/log_rm.txt $path/log_rm.old; 
    :>$path/log_rm.txt  
    fi


    if [ $COUNT = 0 ]; then
        #ACHTUNG!!!
    last=$(ls -ltr | tail -n1 | awk '{print $8}');
    body=" Admin, we have problems on SER2! last incoming files was:  $last" ;
    echo -e $body | mail -S smtp=214.50.70.11 -S from=outgoing@email.com -s "Warning on SER2" -c email2@email.com  $address;

    fi
    sleep 360
done;
wisedraco ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.