Font
[thread]8378[/thread]

2 Tage alte Dateien in einem Ordner löschen: Alte Dateien sollen gelöscht werden

Reader: 1


<< >> 10 entries, 1 page
sequester01
 2006-10-02 11:28
#70420 #70420
User since
2006-10-02
7 articles
BenutzerIn
[default_avatar]
Hallo Ihr,

gleich vorne weg: Ich bin (leider) kein großer Programmierer, und mache nur ab und wann mal was. Im Moment habe ich Perl für mich entdeckt, und stoße gleich an Grenzen:

Ich möchte in einem Win-Ordner 2 Tage alte Dateien löschen. Das Skript soll jede Nacht irgendwann laufen und Dateien aus einem Repository in Windows löschen.
Ich hatte das mal unter Unix mit einem Shellskript gemacht.Da war es für mich sehr einfach:

dir="/home/mein_ordner"
days=2

for datei in 'find $dir -type f -atime +$days -print'
    do
       del $datei
    done

usw.

Gibt es solch einfache Abfolge auch in Perl?
Bisher kämpfe ich mit "stat" und Add_Delta_Days rum. Aber da geht gar nichts.

Bitte -falls Beispiele- immer mit den Modulen, da ich noch nicht so fit bin.

Danke im voraus,

Seq
renee
 2006-10-02 11:48
#70421 #70421
User since
2003-08-04
14371 articles
ModeratorIn
[Homepage] [default_avatar]
Probier mal:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl

use strict;
use warnings;

my $directory = '/path/to/directory/';
my $accesstime = 2; # letzter Zugriff vor 2 Tagen

opendir(DIR,$directory) or die $!;
my @files = grep{$_ !~ /\.\.?$/}readdir(DIR);
closedir DIR;

for my $file(@files){
my $filename = $directory . '/' . $file;
if(-f $filename and -A $filename >= $accesstime){
unlink $filename;
}
}


Kuerzer:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/perl

use strict;
use warnings;

my $dir = '/directory/';
my $last_access = 2;

opendir(DIR,$dir) or die $!;
my @files = grep{-f $_ and -A $_ >= $last_access}map{$dir.'/'.$_}grep{$_ !~ /\.\.?$/}readdir(DIR);
closedir DIR;

unlink @files;
\n\n

<!--EDIT|renee|1159775501-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
sequester01
 2006-10-02 12:12
#70422 #70422
User since
2006-10-02
7 articles
BenutzerIn
[default_avatar]
Klingt gut, Filetest mit -A habe ich einfach übersehen. So einfach kann es sein. Wenn ich es richtig verstehe, ist das Beispiel für unix. Für Win müsste ich dann entsprechend anpassen. Probiere ich mal.

Danke.
sequester01
 2006-10-03 19:56
#70423 #70423
User since
2006-10-02
7 articles
BenutzerIn
[default_avatar]
Hallo,

natürlich waren die Beispiel für Windows, habe mich nur verwirren lassen. Klappt alles bestens - nun möchte ich es aber auch verstehen.
Kann mir bitte jemand in der Grep Zeile  
Code: (dl )
grep{$_ !~ /\.\.?$/}readdir(DIR);
die Logik des monadischen Tildezeichen erklären. Nach meinen Unterlagen macht die "~" eine Bitweise Negation. Dieses hätte ich bei einem Filehandling überhaupt nicht vermutet.

Was ich verstehe:
Code: (dl )
grep{$_
selber ist klar
Code: (dl )
!
Alles was nicht dem Matching in /.../ entspricht
Code: (dl )
/\.\.?/
Zwei Punkte einmal oder keinmal werden gesucht.

Was macht aber die Tilde? Und warum wird bei der Suche  das Verzeichnis "." nicht genommen. Das Verzeichnis ".." ist in der Suche und wird durch das "!" nicht verwendet - aber "." ist doch nicht gesucht ??? (Anm: Da es klappt, wird es ausgeschlossen, aber warum) .

Hat jemand Lust mir die RegEx zu erklären. Ich habe hier zwar zwei Bücher, aber habe es nicht geschaftt, das es "klack" gemacht hat.

Danke im voraus,

Seq
renee
 2006-10-03 20:04
#70424 #70424
User since
2003-08-04
14371 articles
ModeratorIn
[Homepage] [default_avatar]
grep liefert eine Liste, deren Elemente der Bedingung in dem Block entsprechen.

readdir liefert diese Liste, die von grep verarbeitet wird.

$_ enthält immer das aktuelle Element aus dieser Liste.

!~ ist die Negation von =~. Man könnte es also auch so schreiben:
Code: (dl )
grep{!($_ =~ /\.\.?$/)}readdir(DIR);


Ich hoffe, dass es dadurch klarer wird.

Der reguläre Ausdruck selbst ist:
Ein Punkt und dann noch ein Punkt oder kein Punkt
also trifft der reguläre Ausdruck auf
.
und
..
zu

Aber ein Fehler habe ich dennoch eingebaut. Richtigerweise müsste der RegEx so heißen:
Code: (dl )
grep{$_ !~ /^\.\.?$/}readdir(DIR);


Lesenswertes zu RegEx:
perlre
perlreref (deutsch)
perlrequick
perlretut

http://www.regenechsen.de
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
sequester01
 2006-10-03 22:12
#70425 #70425
User since
2006-10-02
7 articles
BenutzerIn
[default_avatar]
Das "^" fehlte für Zeilenanfang der ".." oder ".", richtig?

Nun ist mir vieles klarer. Danke!


Seq
renee
 2006-10-03 23:00
#70426 #70426
User since
2003-08-04
14371 articles
ModeratorIn
[Homepage] [default_avatar]
Ja, das ^ steht für Zeilenanfang (wenn es am Anfang des Regulären Ausdrucks steht).
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
sid burn
 2006-10-04 13:01
#70427 #70427
User since
2006-03-29
1520 articles
BenutzerIn

user image
[quote=renee,03.Oct..2006, 21:00]Ja, das ^ steht für Zeilenanfang (wenn es am Anfang des Regulären Ausdrucks steht).[/quote]
Eigentlich steht das ^ für Stringanfang.
Für Zeilenanfang steht es nur, wenn man die Option /m benutzt.
Und eigentlich ist es auch egal wo ^ steht. Es gilt auch in der Mitte der Regex für Stringanfang/Zeilenanfang.

Code: (dl )
1
2
my $string = "Hallo\nWelt!";
print "[$1][$2]\n" if $string =~ m/(...)^(...)/ms;

Code: (dl )
1
2
[lo
][Wel]
\n\n

<!--EDIT|sid burn|1159952599-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
renee
 2006-10-07 20:44
#70428 #70428
User since
2003-08-04
14371 articles
ModeratorIn
[Homepage] [default_avatar]
Aber nicht in [^abc]... ;)
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Crian
 2006-10-11 18:21
#70429 #70429
User since
2003-08-04
5866 articles
ModeratorIn
[Homepage]
user image
Und vor allem fehlte es in dem Regexp, der aber eh überflüsseig ist, da würde ich lieber gleich auf reguläre Datei testen.
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
<< >> 10 entries, 1 page



View all threads created 2006-10-02 11:28.