Thread zwei Arrays vergleichen und doppelten Inhalt löschen
(31 answers)
Opened by Matze2.pl at 2014-11-13 10:27
Ich habe es versucht so übersichtlich wie nur möglich zu gestalten.
Hier nun meine überarbeitete Version: 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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 #!/usr/bin/perl -w use strict; use warnings; use POSIX; use utf8; use File::Find; my ($datei); my (@files); my ($txtdatein); my ($mumpitz); my ($inhalttxt); my ($files); my ($loesch); my @loesch; my ($alter); my ($kurzalter); my ($txtdatei); my @pfad = glob "*.txt"; my $dir= "/var/lib/testverzeichnis/k_loesch/k_transport/"; my $verzeichnis = "/var/lib/testverzeichnis/k_loesch"; my $mydate = &datum_zeit("D.M.J"); find(\&wanted,$dir) ; sub wanted { my $file = $File::Find::name; #schreibt alle echten Datein in @files push (@files,$file) if(-f $file); } opendir(DIR, $verzeichnis); #packt alle pfade die auf eine textdatei zeigen in @txtdatein my @txtdatein = grep{ $_ =~ /\.txt$/ }readdir(DIR); closedir DIR; foreach $txtdatein (@txtdatein) { #öffnet diese textdateien open (TXT,"<$txtdatein"); #und packt den inhalt in @alletxtdatein my @alletxtdatein = <TXT>; close (TXT); foreach $inhalttxt (@alletxtdatein) { open (INHALTOUT,">>inhalt_aller_txt_datein.txt"); #schreibt den Inhalt aller textdatein in eine textdatei print INHALTOUT "$inhalttxt"; close (INHALTOUT); } } open (INHALTIN,"<inhalt_aller_txt_datein.txt"); #liest den inhalt in ein array my @inhlattxt = <INHALTIN>; close (INHALTIN); my %h = map { $_ => 1 } @inhlattxt; #vergleicht beide arrays und löscht in @files alles was in @inhalttxt (inhalt aller txtdatein) schon steht @files = grep { ! exists $h{$_} } @files; open (ZWEITE,">>$mydate.txt"); #schreibt neuen inhalt in $mydate.txt (der Name dient nur der Übersichtlichkeit print ZWEITE "@files"; close (ZWEITE); foreach $txtdatei (@pfad) { $alter = -M "$txtdatei"; $kurzalter = sprintf "%.0f",$alter; if ($kurzalter > 14) #wenn die erstellte txtdatei älter als 14 tage ist { open (LOESCH,"<$txtdatei"); #wird der inhalt eingelesen @loesch = <LOESCH>; close (LOESCH); foreach $loesch (@loesch) { print "$loesch\n"; unlink "$loesch"; #und dann gelöscht } unlink ("$txtdatei"); } } ## Die sub ist nicht sooo wichtig sah nur schön aus mit dem datum!! sub datum_zeit { my $p=$_[0]; my %DATUM_ZEIT; my $timeparameter; my ($Sekunden, $Minuten, $Stunden, $Monatstag, $Monat, $Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime(time); $Monat+=1; $Jahrestag+=1; $Monat = $Monat < 10 ? $Monat = "0".$Monat : $Monat; $Monatstag = $Monatstag < 10 ? $Monatstag = "0".$Monatstag : $Monatstag; $Stunden = $Stunden < 10 ? $Stunden = "0".$Stunden : $Stunden; $Minuten = $Minuten < 10 ? $Minuten = "0".$Minuten : $Minuten; $Sekunden = $Sekunden < 10 ? $Sekunden = "0".$Sekunden : $Sekunden; $Jahr+=1900; $DATUM_ZEIT{'J'}=$Jahr; $DATUM_ZEIT{'M'}=$Monat; $DATUM_ZEIT{'D'}=$Monatstag; $DATUM_ZEIT{'h'}=$Stunden; $DATUM_ZEIT{'m'}=$Minuten; $DATUM_ZEIT{'s'}=$Sekunden; $DATUM_ZEIT{'T'}=$Wochentag; if ($p) { $p=~s/(J|M|D|h|m|s|T)/$DATUM_ZEIT{$1}/g, while ($p=~/J|M|D|h|m|s|T/); } else { $p=$Jahr.$Monat.$Monatstag.'_'.$Stunden.$Minuten.$ Sekunden; } return $p; } unlink ("inhalt_aller_txt_datein.txt"); SO ich hoffe das ihr das besser lesen könnt :) Es sollen also alle datein in dem verzeichnis in eine TXT-Datei geschrieben werden. Am nächsten Tag sollen alle NEUEN Dateien in diesem Verzeichnis in eine Neue TXT-Datei geschrieben werden. Nur klappt das bei mir nicht :/ ich habe das probiert: Code (perl): (dl
)
1 2 my %h = map { $_ => 1 } @inhlattxt; @files = grep { ! exists $h{$_} } @files; mit zwei array die nur jeweils 3 pfad beinhalteten und davon 1 unterschiedlich war. Da hat es geklappt, aber wenn ich das jetzt so mache wie oben im skript steht funktioniert es nicht. Da schreibt er mir dann in die neue TXT-Datei das was in der alten war + das was neu ist. hat jemand einen lösungsvorschlag dafür? Last edited: 2014-11-13 14:51:22 +0100 (CET) |