Dateien löschen

Dateien löschen

am 17.04.2006 12:30:51 von Heiko Rompel

Moin,

ich möchte gerne alle die Dateien löschen,
deren Dateiname nicht in einer Textdatei vorkommt.

Aber wenn ich das wie unten mache,
dann werden trotzdem alle Files gelöscht.

Kann man eigentlich ein Array komplett durchsuchen
oder nur Zeilenweise wie unten?

MfG
Heiko

======== Quellcode ============

sub kill_files {
my $f = '';
my @dateien;
my @file;
my $zeile;
my $killmarke = 0;
my $sperre = 0;
###========================================================= ============
my $ok = open (DAT, "< $pathtodat");
if ($ok){
flock (DAT,2);
@file = ;
}
else {
&read_error;
}
close (DAT);
###========================================================= ============
opendir(DIR,"$news_pic")||die "Fehler: Kann das Verzeichnis $news_pic
nicht finden\n";
@dateien = readdir(DIR);
foreach $f (@dateien) {
if ($f=~/.jpg|.jpeg|.bmp/){
foreach $zeile (@file){
unless( $zeile =~ /$f/ ){
# hier was mit $f machen
#unlink("../upload/".$f);
if ($sperre eq 0){
$killmarke = 1;
};
}
elsif ( $zeile =~ /$f/ ){
$killmarke =0;
$sperre =1;
}
}
if ($killmarke = 1){
unlink("../upload/".$f);
$killmarke = 0;
$sperre = 0;
}
else {
$sperre = 0;
};
}
}
close(DIR);
};

Re: Dateien löschen

am 17.04.2006 18:43:26 von Christian Lackas

* Heiko Rompel [2006-04-17]:

Hallo Heiko,

> ich möchte gerne alle die Dateien löschen,
> deren Dateiname nicht in einer Textdatei vorkommt.

dann solltest du einfach alle Namen in einem Hash speichern, und dann
die Liste mit Dateien durchgehen und schauen, ob sie im Hash vorkommen
und ansonsten löschen.

my %hash = map {$_,1} qw(/tmp/test/foo /tmp/test/bar);
my @files = ;
for (@files) {
unlink $_ or die "$_:$!" unless exists $hash{$_}
}

> sub kill_files {

Das ist mir jetzt zu viel das alles zu lesen. Aber irgendwo wirst du da
einen Bug drin haben. Ein Ansatz mit einem Array ist zwar möglich, aber
Perl stellt dir ja sehr einfach eine Lookup-Tabelle (den Hash) zur
Verfügung.

Gruß
Christian

--
Man kann alle Pilze essen - aber manche nur einmal.
http://www.lackas.net/ Perl Delphi Linux MP3 Searchengines Domainchecker

Re: Dateien löschen

am 17.04.2006 19:40:01 von Heiko Rompel

Hallo,

"Christian Lackas" schrieb:

> dann solltest du einfach alle Namen in einem Hash speichern,

In der Textdatei die die "Gültigen Dateinamen" enthält, ist aber auch noch
Text
vorhanden.
Das bedeutet doch, ich muß aus dieser Datei erstmal eine Datei/Array machen,
in dem nur die Dateinamen vorhanden sind - richtig?

> und dann die Liste mit Dateien durchgehen und schauen, ob sie im Hash
> vorkommen
> und ansonsten löschen.
>
> my %hash = map {$_,1} qw(/tmp/test/foo /tmp/test/bar);

/tmp/test/foo = ?
/tmp/test/bar = Liste der "gültigen Dateien"
Richtig?

> my @files = ;

Dateien im Verzeichnis - richtig?

> for (@files) {
> unlink $_ or die "$_:$!" unless exists $hash{$_}
> }

Richtig übersetzt:
Nehme Jedes File aus der Verzeichnisliste und Lösche es. ==> for (@files)
{ unlink $_
Wenn nicht möglich Breche ab und gebe den Dateinamen und die Fehlermeldung
aus ==> or die "$_:$!"
Aber der ??? ==> unless exists $hash{$_}

> Das ist mir jetzt zu viel das alles zu lesen.
:-)

> Aber irgendwo wirst du da einen Bug drin haben.

Das denke ich mir.

> Ein Ansatz mit einem Array ist zwar möglich,

Dann war ich ja nicht ganz auf dem flaschen Weg.

> aber Perl stellt dir ja sehr einfach eine Lookup-Tabelle (den Hash) zur
> Verfügung.

Habe ich bis heute noch nicht gebraucht/genutzt.

MfG
Heiko

Re: Dateien löschen

am 17.04.2006 20:16:49 von hjp-usenet2

Heiko Rompel wrote:
> "Christian Lackas" schrieb:
>> dann solltest du einfach alle Namen in einem Hash speichern,
>
> In der Textdatei die die "Gültigen Dateinamen" enthält, ist aber auch
> noch Text vorhanden.

Davon ist in Deinem Code aber nichts zu sehen.

> Das bedeutet doch, ich muß aus dieser Datei erstmal eine Datei/Array
> machen, in dem nur die Dateinamen vorhanden sind - richtig?

Nein, wieso? Du extrahierst die Dateinamen der Reihe nach aus der Datei
und speicherst sie im Hash.

Das müsstest Du auch bei Deinem Ansatz mit dem Array machen, tust es
aber nicht:

@files =

erzeugt Dir ein Array aller Zeilen inklusive Newline. Ich glaube kaum,
dass Deine Filenamen alle ein Newline am Ende haben.


>> und dann die Liste mit Dateien durchgehen und schauen, ob sie im Hash
>> vorkommen
>> und ansonsten löschen.
>>
>> my %hash = map {$_,1} qw(/tmp/test/foo /tmp/test/bar);
>
> /tmp/test/foo = ?
> /tmp/test/bar = Liste der "gültigen Dateien"
> Richtig?

Nein. "/tmp/test/foo" und "/tmp/test/bar" sind in dem Fall die Namen der
Files, die nicht gelöscht werden sollen. Christian hat sie direkt ins
Programm geschrieben, statt sie aus einem File zu lesen.

>> my @files = ;
>
> Dateien im Verzeichnis - richtig?

Ja.


>> for (@files) {
>> unlink $_ or die "$_:$!" unless exists $hash{$_}
>> }
>
> Richtig übersetzt:
> Nehme Jedes File aus der Verzeichnisliste und Lösche es. ==> for
> (@files)
> { unlink $_
> Wenn nicht möglich Breche ab und gebe den Dateinamen und die
> Fehlermeldung aus ==> or die "$_:$!"
> Aber der ??? ==> unless exists $hash{$_}

Was verstehst Du nicht? "unless", "exists" oder "$hash{$_}"?

perldoc perlsyn
perldoc -f exists
perldoc perldata

hp

--
_ | Peter J. Holzer | Löschung von at.usenet.schmankerl?
|_|_) | Sysadmin WSR/LUGA |
| | | hjp@hjp.at | Diskussion derzeit in at.usenet.gruppen
__/ | http://www.hjp.at/ |

Re: Dateien löschen

am 18.04.2006 02:18:30 von David Haller

Heiko Rompel wrote:
> "Christian Lackas" schrieb:
>> dann solltest du einfach alle Namen in einem Hash speichern,
>
> In der Textdatei die die "Gültigen Dateinamen" enthält, ist aber
> auch noch Text vorhanden.

Hae?

> Das bedeutet doch, ich muß aus dieser Datei erstmal eine Datei/Array machen,
> in dem nur die Dateinamen vorhanden sind - richtig?

Nein. Ein Hash ist sinnvoller.

>> und dann die Liste mit Dateien durchgehen und schauen, ob sie im Hash
>> vorkommen
>> und ansonsten löschen.
>>
>> my %hash = map {$_,1} qw(/tmp/test/foo /tmp/test/bar);
>
> /tmp/test/foo = ?
> /tmp/test/bar = Liste der "gültigen Dateien"
> Richtig?

Nein. Das qw(..) steht hier fuer das Array der Dateinamen.

>> my @files = ;
>
> Dateien im Verzeichnis - richtig?

Ja. Wuerde ich aber nicht so machen.

>> for (@files) {
>> unlink $_ or die "$_:$!" unless exists $hash{$_}
>> }
>
> Richtig übersetzt:
> Nehme Jedes File aus der Verzeichnisliste und Lösche es. ==> for (@files)
> { unlink $_
> Wenn nicht möglich Breche ab und gebe den Dateinamen und die Fehlermeldung
> aus ==> or die "$_:$!"
> Aber der ??? ==> unless exists $hash{$_}

Mach garnix, wenn $hash{$_} nicht existiert.

Ich wuerde es vermutlich so machen (fuer Tests entschaerft):

==== UNGETESTET! ====
#!/usr/bin/perl -w
use strict;

open (KFF, '<', "datei_mit_dateinamen") or die "$!\n";
my %keepfiles = map { chomp $_; $_, 1 } ;
close(KFF) or die "$!\n";

opendir(DIR, "/tmp/test") or die "$!\n";
print "unlink $_\n" for grep { ! $keepfiles{$_}; } readdir(DIR);
closedir(DIR);
====

Oder, anders geschrieben:

==== UNGETESTET! ====
#!/usr/bin/perl -w
use strict;

open (KF, '<', "datei_mit_dateinamen") or die "$!\n";
my %keepfiles;
foreach() {
chomp $_;
$keepfiles{$_} = 1;
}
close(KF) or die "$!\n";

opendir(DIR, "/tmp/test") or die "$!\n";
foreach(readdir(DIR)) {
if( ! $keepfiles{$_} ) {
print "unlink $_\n";
}
}
closedir(DIR);
====

HTH,
-dnh

--
Flhacs wird im Usenet grundsätzlich alsfhc geschrieben. Schreibt man
lafhsc nicht slfach, so ist das schlichtweg hclafs.
(Hajo Pflueger in de.newuser.questions)

Danke - Re: Dateien löschen

am 28.04.2006 21:48:09 von Heiko Rompel

Nur einfach DANKE.

MfG
Heiko

Re: Dateien löschen

am 28.04.2006 21:49:12 von Heiko Rompel

Hallo,

"Peter J. Holzer" schrieb:
[...]

Danke.

MfG
Heiko