Quotemeinst, verstehe ich nicht. Erkläre das doch bitte näher.parent id..
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
#!/usr/bin/perl use strict; use warnings; use File::Find; use DBI; # Verzeichnis von Kommandozeile holen my $verzeichnis = shift(@ARGV) || '.'; # Array für die gefundenen Dateien my @dateien; # Routine, die Dateien findet sub wanted { push @dateien,$File::Find::name # schiebe Dateinamen in Array if $File::Find::name ne "." # wenn Datei ist nicht aktuelles Verzeichnis and $File::Find::name ne ".." # Datei ist nicht übergeordenetes Verzeichnis and -f $File::Find::name; # Dateiname ist eine Datei } # Suche nach Dateien starten find(\&wanted, $verzeichnis); my $datenbank = 'meinedateidb'; # Name der MySQL-Datenbank my $tabelle = 'Dateien'; # Name der Tabelle in der DB my $spaltenname = 'Dateiname'; # Name der Spalte in der Tabelle my $dsn = "dbi:mysql:$datenbank"; # zu Datenbank verbinden my $dbh = DBI->connect( $dsn, "LoGiNNuTzErNaMe", "geHeImP455w0r7" ); # SQL vorbereiten my $sth = $dbh->prepare( q{INSERT INTO ? (?) VALUES (?);} ); # in Schleife Dateinamen aus Array holen for my $dateiname (@dateien) { # und SQL ausführen und Daten in Datenbank schreiben $sth->execute($tabelle, $spaltenname, $dateiname); } # von Datenbank abmelden $dbh->disconnect(); 1;
my $dbh = DBI->connect( $dsn, "LoGiNNuTzErNaMe", "geHeImP455w0r7" );
my $dbh = DBI->connect( $dsn, "LoGiNNuTzErNaMe", "geHeImP455w0r7", { RaiseError => 1 } );
Quotedbi:DriverName:database_name
dbi:DriverName:database_name@hostname:port
dbi:DriverName:database=database_name;host=hostname;port=port
my $dsn = "dbi:mysql:$datenbank";
my $dsn = "dbi:mysql:database=$datenbank;host=localhost";
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
#!/usr/bin/perl use strict; use warnings; use File::Find; use DBI; # Verzeichnis von Kommandozeile holen my $verzeichnis = shift(@ARGV) || 'C:\xampp'; # Array für die gefundenen Dateien my @dateien; # Routine, die Dateien findet sub wanted { push @dateien,$File::Find::name # schiebe Dateinamen in Array if $File::Find::name ne "." # wenn Datei ist nicht aktuelles Verzeichnis and $File::Find::name ne ".." # Datei ist nicht übergeordenetes Verzeichnis and -f $File::Find::name; # Dateiname ist eine Datei } # Suche nach Dateien starten find(\&wanted, $verzeichnis); my $datenbank = 'auslesen'; # Name der MySQL-Datenbank my $tabelle = 'aktuellelage'; # Name der Tabelle in der DB my $spaltenname = 'Name'; # Name der Spalte in der Tabelle my $dsn = "dbi:mysql:database=$datenbank;host=localhost"; # zu Datenbank verbinden my $dbh = DBI->connect( $dsn, "root", "password", { RaiseError => 1 } ); # SQL vorbereiten my $sth = $dbh->prepare( q{INSERT INTO ? (?) VALUES (?);} ); # in Schleife Dateinamen aus Array holen for my $dateiname (@dateien) { # und SQL ausführen und Daten in Datenbank schreiben $sth->execute($tabelle, $spaltenname, $dateiname); } # von Datenbank abmelden $dbh->disconnect(); 1;
my $sth = $dbh->prepare( q{INSERT INTO ? (?) VALUES (?);} );
my $sth = $dbh->prepare( qq{INSERT INTO $tabelle ($spaltenname) VALUES (?);} );
$sth->execute($tabelle, $spaltenname, $dateiname);
$sth->execute($dateiname);
2012-05-16T06:50:26 antonKlappt es denn jetzt wenigstens mit dem Eintrag in die DB?Habe die zwei Sachen ersetzt und hatte noch ein paar Fragen:
QuoteWo wird eine ID zugeordent? Ordner (Verzeichnisse) haben keine ID.1)Wird bei dem Aufruf auch eine ID zugeordner und in die mysql datenbank reingeschrieben?
QuoteWas unterstützt wieviele Unterordner? Du fragst, wie viele Unterordner du mit find scannen kannst?2)Wie viele unterordner unterstützt dies?
QuoteEs ermittelt die Dateinamen, in dem es die Dateien einliest, stößt es auf ein Verzeichnis, wird erst dieses weiter erforscht und dann am Ende wieder zurück gesprungen und weitere Dateien eingelesen.3)also dein skript ermittelt die größen&namen von verzeichnissen und Dateien rekursiv oder?
QuoteDu brauchst keine Funktion extra. Wenn du in der Crontab einen Eintrag mit eigenen Parametern für das Verzeichnis hinzufügst, reicht das doch.4)Könnte ich noch eine funktion reinbauen, damit der skript automatisch zb alle 3 tage selber durchlaufen soll durch Cron?
QuoteNochmals, welche Parent-IDs meinst du?5)die parent ids brauche ich wegen der Baumstruktur später
QuoteIn dem du diese Daten mit der Funktion stat ausliest und als weitere Tabellenfelder in deine Datenbanktabelle einfügst.6)Wie kann ich das mit der Größe der Verzeichnisse&Dateien und Timestamp regeln?
QuoteWer zeigt dir einen Namen? Bitte erkläre es genauer.7)Er zeigt bei mir im internet explorer als Name den Verzeichnis?
QuoteAch du willst, dass die bei 0 anfangen?8)Jedesmal wenn ich den perl script ausführe kommen neue dateien in die mysql tabelle also er überschreibt nicht die vorhandenen. Und wenn ich die datensätze lösche und dann nochmal perl ausführe zählt er nicht von 0 sondern da wo er letze mal aufgehört hat (wegen autoinkrement).
my $sth = $dbh->prepare( qq{INSERT INTO $tabelle ($spaltenname) VALUES (?);} );
1 2
my $sth = $dbh->prepare( qq{INSERT INTO $tabelle ($spaltenname) VALUES (?) ON DUPLICATE KEY UPDATE $spaltenname=?; } );
$sth->execute($dateiname,$dateiname);
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
#!/usr/bin/perl use strict; use warnings; $| = 1; use File::Find; use File::Spec; # Verzeichnis von Kommandozeile holen my $verzeichnis = shift(@ARGV) || '.'; # Array für die gefundenen Dateien my @dateien; my $id = 0; my $parent; my %ids; sub wanted { if ( $_ ne '..' ) { $ids{ $File::Find::name } = $id; $parent = $File::Find::dir; push @dateien,{ id => $id++, fullname => $File::Find::name, name => $_, parent => $parent, parentid => $ids{ $parent }, stat => [ (stat($File::Find::name))[8,9,10] ] }; } } # Suche nach Dateien starten find(\&wanted, File::Spec->rel2abs($verzeichnis) ); for my $datei (@dateien) { print "ID:",$datei->{id}, "\tPARENT:",$datei->{parent}, "\tPARENTID:",$datei->{parentid}, "\tNAME:",$datei->{name}, "\tFULLNAME:",$datei->{fullname}, "\tSTAT:",join " ",@{$datei->{stat}}, "\n"; }
size => (stat($File::Find::name))[7],
Quote-ab 0 anfangen würde
1 2 3 4 5 6 7 8 9 10 11 12
#Dateiname, Dateigröße, ID, PID und Timestamp(letzte modification) my $sth = $dbh->prepare( "INSERT INTO $tabelle (name,size,id,pid,mtime) VALUES(?,?,?,?,?);" ); for my $datei (@dateien) { $sth->execute( $datei->{name}, $datei->{size}, $datei->{id}, $datei->{parentid}, $datei->{stat}[1] ); }
2012-05-21T10:33:30 antonWenn du dann den Wert aus der Datenbank liest, rechne ihn doch mit SQL gleich um.1)Er gibt mir den Zeit in Unix -timestamp an wie kann ich daraus eine normale uhrzeit machen?
SELECT FROM_UNIXTIME(mtime) FROM tabellenname;
QuoteAuch hier mit SQL, wenn du das aus der Datenbank ausliest.2)die größe gibt er mir in bytes an. geht das auch in MB?
SELECT size/1048576 FROM tabellenname;