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

На бэше почти не пишу, поэтому обращаюсь за помощью!
...
Рейтинг: 0 / 0
помогите с простеньким bash-cкриптом, плиз!
    #38651589
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
man du
man ls
man expr / bash
...
Рейтинг: 0 / 0
помогите с простеньким bash-cкриптом, плиз!
    #38652505
Мутаген
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bash - не догма, можно написать на знакомом языке ;)
...
Рейтинг: 0 / 0
помогите с простеньким bash-cкриптом, плиз!
    #38657557
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
помогите с простеньким bash-cкриптом, плиз!
    #38658206
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простенький?
Код: 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
помогите с простеньким bash-cкриптом, плиз!
    #38659168
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хорошая штука получилась.
и простенькая, как ТС и хотел.
один минус - не работает.
...
Рейтинг: 0 / 0
помогите с простеньким bash-cкриптом, плиз!
    #38659477
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правда?
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / помогите с простеньким bash-cкриптом, плиз!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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