Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / помогите с простеньким bash-cкриптом, плиз! / 7 сообщений из 7, страница 1 из 1
25.05.2014, 19:47
    #38651479
ViktorWM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с простеньким bash-cкриптом, плиз!
нужно чтоб сей скриптик (который я запущу ежечасно по cron-джобу) проверял общий размер папки куда постоянно пишутся новые файлы. Если размер папки превысил некую границу X (mb), то удаляй САМЫЕ СТАРЫЕ файлы в папке, пока она не вернётся в размер меньший X.

На бэше почти не пишу, поэтому обращаюсь за помощью!
...
Рейтинг: 0 / 0
26.05.2014, 02:29
    #38651589
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с простеньким bash-cкриптом, плиз!
man du
man ls
man expr / bash
...
Рейтинг: 0 / 0
26.05.2014, 19:49
    #38652505
Мутаген
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с простеньким bash-cкриптом, плиз!
bash - не догма, можно написать на знакомом языке ;)
...
Рейтинг: 0 / 0
31.05.2014, 00:10
    #38657557
volodin661
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с простеньким bash-cкриптом, плиз!
ViktorWM,

простенький перл-скрипт :

Код: coco
1.
keepsz --limit=100M --folder=/var/log/cups/*.gz



есть функционал генерирования N-файлов в подкаталоге для проверки того, как он будет в нём удалять

Код: coco
1.
keepsz --generator=50



а вот и сам скрипт:

Код: perl
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
#!/usr/bin/perl -w
use strict;
use Getopt::Long;
use bigint;

sub usage () {

    print <<EOF;

USAGE:

Counts size of files pointed by mask in <folder> and delete older files
if total size of files is greater than <limit>

    $0 --limit=100M --folder=/var/log/cups/*.gz
        or
    $0 --generator=100 ( generates 100 files in subdir ./100-files just for testing )

( you can add letters K, M, G to number for Kilo-, Mega- or Giga- bytes )

EOF

    exit;
}

sub get_limit(@);
sub generator(@);


my $limit       = '1275';
my $folder      = '50-files/*';
my $help        = 0;
my $verbose     = 0;

GetOptions (

    "verbose"     =>   \$verbose,
    "folder=s"    =>   \$folder,
    "limit=s"     =>   \$limit,
    "generator=i" =>   \&generator,
    "help|?"      =>   \&usage,

) or usage();

my $limit_bytes = get_limit($limit) or usage();
my $total_files = 0;
my $sum_bytes   = 0;
my $deleted     = 0;
my @mustdie
   =   
       grep { ($sum_bytes > $limit_bytes) and ($sum_bytes -= $_->{'size'}) }
       sort { $b->{'mdate'} <=> $a->{'mdate'} }
       map  { { name => $_, mdate => -M, size => -s } }
       map  { $sum_bytes += -s; $total_files += 1; $_ } 
       grep { -f }
       glob $folder;

for ( @mustdie ) {

    if ($verbose ) {
        warn sprintf "File %40s, having size %s last modified %s days ago, will be deleted",
                     $_->{'name'},
                     $_->{'size'},
                     $_->{'mdate'};
    }
    $deleted += unlink $_->{'name'} or warn $!;
}

print  "Total $total_files files, ",  scalar @mustdie,
          " file(s) proceeded, $deleted files deleted, keeping $sum_bytes bytes\n";


sub generator(@) {

    my ($opt_name, $count ) = @_;
    mkdir "$count-files";
    my $total_size = 0;
    unlink glob "$count-files/*";
    
    for ( my $j=1; $j <= $count; ++$j ) {
        open F, ">", sprintf("$count-files/%0*d", length $count, $j) or die $!;
        print F '.' for 1 .. $j;
        $total_size += $j;
    }
    
    print <<EOF;

$count files resides in the folder $count-files with total size $total_size.
Now you can add some file(s) with arbitrary size to this folder and run:

$0 --folder=$count-files/* --limit=$total_size

( old files should be deleted to fit in total's size $total_size. check it)

EOF


    exit($count);

}


sub get_limit(@) {
    
    my $limit_str = uc shift;

    my %kmg = ( K=>1024, M=>1024*1024, G=>1024*1024*1024, 1=>1 );

    $limit_str =~ / (\d+) ([KMG])* /x;
    
    return $1 * $kmg{ $2 or '1' }; 
}
...
Рейтинг: 0 / 0
02.06.2014, 02:33
    #38658206
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с простеньким bash-cкриптом, плиз!
Простенький?
Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
#!/bin/sh
#
MAX_SIZE_MBYTES=20

while true
do
    cur_size=`ls -l | awk '{size += $5} END {print size}'`
    cur_mb=`expr $cur_size / 1024 / 1024`
    if [ $cur_mb -le $MAX_SIZE_MBYTES ]; then
        exit
    fi
    del_file=`ls -t|tail -1`
    rm $del_file
done
...
Рейтинг: 0 / 0
02.06.2014, 18:27
    #38659168
volodin661
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с простеньким bash-cкриптом, плиз!
хорошая штука получилась.
и простенькая, как ТС и хотел.
один минус - не работает.
...
Рейтинг: 0 / 0
03.06.2014, 02:19
    #38659477
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с простеньким bash-cкриптом, плиз!
Правда?
...
Рейтинг: 0 / 0
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / помогите с простеньким bash-cкриптом, плиз! / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]