Schrift
[thread]6589[/thread]

Verzeichnisgröße ermitteln: Gibt es etwas vergleichbares zu -f ?

Leser: 2


<< |< 1 2 3 >| >> 27 Einträge, 3 Seiten
cbxk1xg
 2004-12-21 00:05
#50224 #50224
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Gibt es etwas vergleichbares zu -f für Verzeichnisse?

Ich suche eine möglichst schlanke Variante, um die Größe eines Verzeichnisses inkl. darin befindlicher Unterordner und Dateien zu finden.

Ich weiß das man mit -f meinedatei.txt die Größe einer Datei zurückbekommt. Bei einem Verzeichniss bekomme ich aber jedes mal den gleichen Wert zurück. Ich vermute mal, dass Perl hier die Größe auf dem Datenträger ermittelt, die der Eintrag eines Verzeichnisses im Dateisystem verschlingt.

Leider sind aber die im Ordner befindlichen Dateien oder Unterordner mit darin enthaltenen Dateien nicht mit drin.

Ich will jetzt aber nicht rekursiv das ganze Verzeichniss auslesen und die Größe der Dateien editieren. Das kann bei einem sehr großen Ordner nämlich durchaus etwas länger dauern.\n\n

<!--EDIT|cbxk1xg|1103580343-->
esskar
 2004-12-21 00:23
#50225 #50225
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
nicht -f, sondern -s

und ohne rekursiv durchzulaufen, geht es nicht
cbxk1xg
 2004-12-21 00:30
#50226 #50226
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Ich habe mich vertan. Ich meinte auch -s. Ich weiß das -f für "File is a plain file." steht. Das heißt also ich muss alles "von Hand" auslesen. Sche***! Das hatte ich mir schon fast gedacht.

@esskar: Eigentlich doch ein klassischer Fall für eine Klasse, oder? Also im Sinne von: &dirsize( $dir )

Es hat nicht zufällig einer von Euch ne fertige Klasse, oder? Ne, war nur Spaß. Ich muß endlich aufhören so faul zu sein.\n\n

<!--EDIT|cbxk1xg|1103582116-->
format_c
 2004-12-21 02:14
#50227 #50227
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Also es gibt aus dem Namensraum Win32 solch ein Modul. Weis allerdings nicht obs mit *NIX-Dateisystemen auch zurecht kommt,

CPAN:Win32::DirSize

gruß Alex
cbxk1xg
 2004-12-21 03:18
#50228 #50228
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Ich werd's mir mal ansehen. Obwohl ich es gerne ohne Modul machen würde. Denn je mehr exotische Module, desto weniger kompatibel wird es zu den meißten Webspaceanbeitern. Nicht jeder darf als root Module nachinstallieren. - Wobei ich jetzt Module meine, die man vorher erst mit make kompilieren muss.
cbxk1xg
 2004-12-21 08:42
#50229 #50229
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Also für alle die es interessiert hier meine Lösung. Wo ich schon dabei war, habe ich gleich noch eine paar kleine Details mit eingebaut. Vielleicht ist es ja was für die FAQs?

Ich rufe eine sub auf und übermittle den Pfad:
&GetFolderInfo($mypath);

Code: (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
32
33
34
35
36
37
38
39
40
41
sub GetFolderInfo
{
my @dirs = @_;
my (@allfiles, @files, @folders) = ();
my ($currdir, $file, $size, $measurement, $numfolders) = "";

while (@dirs != 0)
{
$currdir = pop( @dirs );
opendir( ENTRIES, "$currdir/" );
@allfiles = readdir( ENTRIES );
closedir( ENTRIES );

    foreach $file (@allfiles)
    {
        if (-d "$currdir/$file")
        {
        push( @folders, "$currdir/$file" ) if (($file ne ".") && ($file ne ".."));
        push( @dirs, "$currdir/$file" ) if (($file ne ".") && ($file ne ".."));
        }

        else
        {
        push( @files, "$currdir/$file" );
        my $currfile = "$currdir/$file";
        my $currsize = -s $currfile;
        $size = $size + $currsize;
        }
    }
}

my $numfiles = @files;
my $numfolders = @folders;

$size = sprintf("%.2f",$size / 1024);
$measurement = "KB";
if ($size > 1024) {$size = sprintf("%.2f",$size / 1024); $measurement = "MB";}
if ($size > 1024) {$size = sprintf("%.2f",$size / 1024); $measurement = "GB - WARNING! THE FOLDER IS WAY TO BIG!";}
$size =~ y/./,/;
return "$size $measurement<br>$numfiles files<br>in $numfolders (sub)-folder(s)";
}


Das Ergebniss sieht dann z.B. so aus:
368,30 KB
35 files
in 4 (sub)-folder(s)\n\n

<!--EDIT|cbxk1xg|1103611619-->
cbxk1xg
 2004-12-21 09:03
#50230 #50230
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Eine Frage hätte ich aber noch. Momentan gebe ich mit return einen ganzen Batzen an Infos zurück. Ich hätte diese Infos jedoch lieber getrennt in einer NICHT-globalen Variable. Dann könnte ich die einzelnen Teile besser weiterverarbeiten. Also z.B. die Ausgabe besser formatieren.

Ich dachte da an etwas wie:
return "$size";
return "$measurement";
return "$numfiles ";
return "$numfolders ";

...was natürlich so nicht geht.
coax
 2004-12-21 09:18
#50231 #50231
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
Gib's als Liste zurueck...
Code: (dl )
1
2
3
4
5
6
7
sub GetFolderInfo { 
   # [...]
   return $size, $measurement, $numfiles, $numfolders;
   # [...]
}

my @folder_infos = GetFolderInfo( './' );


oder in einen anonymen Hash
Code: (dl )
1
2
3
4
5
6
7
8
9
sub GetFolderInfo {
   # [...]
   return {'size' => $size, 'measurement' => $measurement, # ....
         };    
   # [...]
}

my $folder_infos = GetFolderInfo( './');
print $folder_infos->{size};


aber warum nimmst du nicht File::Find (das ist doch ueberall vertreten)?
Code: (dl )
$ perl -MFile::Find -e 'find (sub{ $sum += -s unless /^\.\.?$/ }, @ARGV); print "$sum\n"' -- ./


Grusz coax.
,,Das perlt aber heute wieder...'' -- Dittsche
cbxk1xg
 2004-12-21 09:29
#50232 #50232
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Die Idee mit dem Hash ist gut.

Quote
Aber aber warum nimmst du nicht File::Find (das ist doch ueberall vertreten)?

Darauf würde ich mich nicht verlassen. Einer meiner Freunde hat ein Webhostingpaket bei Hosteurope und da is nix mit File::Find. Die haben so gut wie nix an Perlmodulen auf ihren Kisten. Und ich vermute mal stark, dass dies nicht die einzige Ausnahme ist.
coax
 2004-12-21 09:39
#50233 #50233
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
[quote=cbxk1xg,21.12.2004, 08:29]Die Idee mit dem Hash ist gut.
Darauf würde ich mich nicht verlassen. Einer meiner Freunde hat ein Webhostingpaket bei Hosteurope und da is nix mit File::Find. Die haben so gut wie nix an Perlmodulen auf ihren Kisten. Und ich vermute mal stark, dass dies nicht die einzige Ausnahme ist.[/quote]
File::Find koenntest auch mit deinen Script ausliefern (bevor du's selbst codest) (da muss IMO nichts kompiliert werden), bei mir wuerde da allerdings ein Providerwechsel anstehen ;).

Grusz coax.
,,Das perlt aber heute wieder...'' -- Dittsche
<< |< 1 2 3 >| >> 27 Einträge, 3 Seiten



View all threads created 2004-12-21 00:05.