Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]5637[/thread]

Dateinameliste und Größe?



<< >> 6 Einträge, 1 Seite
Math55
 2003-08-19 19:55
#69563 #69563
User since
2003-08-19
44 Artikel
BenutzerIn
[default_avatar]
hallo, sagen wir mal, ich habe eine datei mit dateinamen so wie diese hier:

3.6M /var/log
28k /var/log/XFree86.0.log
48k /var/log/auth.log
116k /var/log/auth.log.0
12k /var/log/auth.log.1.gz
12k /var/log/auth.log.2.gz
12k /var/log/auth.log.3.gz
80k /var/log/daemon.log
940k /var/log/ksymoops
16k /var/log/daemon.log.1.gz
20k /var/log/daemon.log.2.gz
16k /var/log/daemon.log.3.gz
80k /var/log/debug
216k /var/log/debug.0
1.5M /var/log(test.gz
12k /var/log/debug.1.gz
16k /var/log/debug.2.gz
12k /var/log/debug.3.gz
8.0k /var/log/dmesg
12k /var/log/faillog
304k /var/log/kdm.log
4.0k /var/log/kern.log
20k /var/log/kern.log.0
8.0k /var/log/kern.log.1.gz
8.0k /var/log/kern.log.2.gz
4.0k /var/log/kern.log.3.gz
940k /var/log/ksymoops
228k /var/log/ksymoops/20030816062503.ksyms
4.0k /var/log/ksymoops/20030816062503.modules
228k /var/log/ksymoops/20030817062502.ksyms
4.0k /var/log/ksymoops/20030817062502.modules
4.0k /var/log/ksymoops/20030818.log
228k /var/log/ksymoops/20030818062502.ksyms
4.0k /var/log/ksymoops/20030818062502.modules
4.0k /var/log/ksymoops/20030819.log
228k /var/log/ksymoops/20030819062502.ksyms
4.0k /var/log/ksymoops/20030819062502.modules
60k /var/log/lastlog
0 /var/log/lpr.log
4.0k /var/log/lpr.log.0
0 /var/log/mail.err


davon möchte ich von einigen dateien die größe haben, also zum beispiel:

größe von
60k /var/log/lastlog + 940k /var/log/ksymoops + 4.0k /var/log/lpr.log.0

und so weiter. die dateien, von denen ich die gesamtgröße brauche stehen in einem array. in diesem fall also 3 elemente im array. ich habe es mit -s versucht, ist zu langsam bei vielen dateien, dann hab ichs mit grep versucht, also so:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
my $grep=`grep '$selection[$i]' /tmp/DATEINAME`;
(my $zahl, my $pfad)=split('\t',$grep);

my $q=quotemeta($pfad);
if($grep =~m/$q/g){
#print "AUTO\n";
#print "$grep";
$zahl=~s/^(\d+)k/$1 000/gi;
$zahl=~s/^(\d+)\.(\d)+M/$1$2 000000/gi;
$zahl=~s/ //g;
#$zahl*=1000;
#print "zahl: $zahl\n";
$size += $zahl;
#print "size: $size\n";

}


ist auch zu lahm....wie könnte mann es denn noch machen? mit hashs? in $selection[$i] stehen die zu berechnenden dateien!

DANKE:-)
Strat
 2003-08-19 20:21
#69564 #69564
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code (perl): (dl )
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
my &#36filename = '???';

my %files = ();
unless (open (FILE, &#36filename)) {
  die "Error: couldn't read '&#36filename': &#36!\n";
}
else {

  while (<FILE>) {
    chomp(&#36_);
    my (&#36size, &#36filename) = split(/\s+/, &#36_, 2); # es koennen ja auch Leerzeichen im Dateinamen sein...

    # hier noch eine sicherheitsabfrage, ob die Datei 
    # auch wirklich noch nicht zu %files hinzugefuegt wurde:
    if (exists &#36files{&#36filename}) {
     print "Dublicate entry for '&#36filename}'\n";
    } # if
    else {
     &#36files{&#36filename} = &#36size;
    } # else

  } # while

  close (FILE);
} # else

# ausgeben:
foreach (sort keys %files) {
  print "&#36_ => &#36files{&#36_}\n";
}
# oder was du auch immer damit machen willst...
\n\n

<!--EDIT|Strat|1061310159-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Math55
 2003-08-20 12:27
#69565 #69565
User since
2003-08-19
44 Artikel
BenutzerIn
[default_avatar]
hallo, so würde ich ja aber alle dateien aus der datei berechnen! icg brauch aber eben nur ganz bestzimmte dateien. wenn also zum beispiel 100 pfade in der liste stehen, kann es es sein, daß ich nur 3 davon zusammenaddieren muß!!! oder versteh ich deine lösung nur falsch? ich kanns erst in 2 stunden probieren...

DANKE
Crian
 2003-08-20 12:31
#69566 #69566
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Kann es sein, dass die Größe Deiner Dateien ganz vorn schon steht? Oder brauchst Du die Größen exakter?
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Math55
 2003-08-20 13:42
#69567 #69567
User since
2003-08-19
44 Artikel
BenutzerIn
[default_avatar]
nein nein:-). sagen wir mal, alle dateien aus der liste sind 10 mb groß. ich hab jetzt ein array, in welchem zum beispiel 5 dateien aus der liste stehen. nun muß ich die arrayelemente mit den einträgen der liste vergleichen. wenn arrrayelement und listenzeile übereinstimmen, will ich die zahl aus der liste nehmen und in einer variablen speichern. so oft, bis keine übereinstimmung mehr auftritt. sind also 5 elemente im array, müssen 5 zahlen addiert werden, so das dann die summe der 5 rauskommt. es sollen aber auf keinen fall alle zahlen der liste addiert werden. im prinzip hab ichs ja auch, nur das es eben zu lahm ist.....

DANKE
Strat
 2003-08-20 15:06
#69568 #69568
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
my &#36filename = '???';
my @filelist = qw(/usr/bin/perl /usr/local/bin/perl);

# suchmuster vorbereiten (ineffizient bei grosser @filelist)
my &#36searchString = join("|", map {quotemeta(&#36_)} @filelist);

unless (open (FILE, &#36filename)) {
  die "Error: couldn't read '&#36filename': &#36!\n";
}
else {

  while (<FILE>) {
    chomp(&#36_);

    my (&#36size, &#36filename) = split(/\s+/, &#36_, 2); # es koennen ja auch Leerzeichen im Dateinamen sein...

    if (&#36filename =~ /^(&#36searchString)&#36/o) {
     print "&#36filename: &#36size\n";
    } # if
    
  } # while

  close (FILE);
} # else
\n\n

<!--EDIT|Strat|1061377783-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< >> 6 Einträge, 1 Seite



View all threads created 2003-08-19 19:55.