Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]6238[/thread]

Doppelte Dateien löschen: Löschen mit Fehlertoleranz



<< |< 1 2 3 >| >> 30 Einträge, 3 Seiten
Netspider
 2004-05-07 19:35
#82080 #82080
User since
2003-09-25
49 Artikel
BenutzerIn
[Homepage] [default_avatar]
hi,

ich bin gerade mit meinem latein -perl- am ende.
ich habe einen ordner mit vieeelen liedern und möchte doppelte lieder löschen.
ich habe mir ein programm geschrieben, dass lieder löscht, die _\d.mp3 am ende haben, das ist die standardart, wie doppelte lieder benannt sind.
aber nun sind auch viele lieder dabei, die leichte namensunterschiede haben und deswegen nicht als gleich erkannt werden, zum beispiel mit rechtschreibfehlern und sonderzeichen ( ' )...

ich hab mir deswegen ein prog geschrieben, welches diese doppelten lieder findet, das problem ist nur, dass ich diese nicht löschen kann, da ich den dateinamen dann nicht mehr habe!

ich möchte lieder nicht einfach löschen, sondern nur das größte behalten.

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
$ordner="Songs";

opendir(d,"$ordner") or do { print "$!"; exit; };
@files=grep {/\.mp3$/} readdir d or do { print "$!"; exit; };
closedir(d);

$found=0;
foreach $file (@files)
{
next if $file =~ m/unknown/i;
next if $file =~ m/untitled/i;

$orifile = $file; # backup
$file =~ s/(_\d+)?\.mp3$//ig; # doppeltes ende weg
$file =~ s/feat.*?-//ig; # "featuring..." entfernen
$file =~ s/presents.*?-//ig; # "presents..." entfernen
$file =~ s/and.*?-//ig; # "and..." entfernen
$file =~ s/\bthe\b//ig; # "the" entfernen
$file =~ s/(th|ht)/t/ig; # schreibfehler th/ht -> t
$file = lc($file); # kleinschreiben
$file =~ s/[^a-z]//ig; # alle sonderzeichen weg
$total{$file}++; # zum hash addieren

}
foreach (sort keys %total)
{
if($total{$_}>1)
{
print $total{$_}."\t: ".$_."\n";
$found+=$total{$_}-1;
}
}
print "Finished\n";
print "Found $found double files";
<>;


da ist jetzt nichts mit strict und my, aber ich denk ihr verstehts trotzdem ;-)
mit
Code: (dl )
stat($file)[7]
bekomm ich die dateigröße, aber wie komm ich wieder an $file ran?
kann mir jemand einen weg sagen, diese lieder zu löschen, wenn sie kleiner als ihre doppelgänger sind?
perl -e "s;;Ronny Lindner;;m;(..).$;;$l=$1;s;n;;g;m;.{4}$;;$_=$l;$I=$&;m;^(.);;$_.='ts';$_.=$1;$_++;$_++;$_.=$I;print ucfirst;"
Crian
 2004-05-07 20:19
#82081 #82081
User since
2003-08-04
5871 Artikel
ModeratorIn
[Homepage]
user image
> aber wie komm ich wieder an $file ran?
über $file?
Sorry, aber ich versteh die Frage nicht ???

P.S. Ganz allgemein finde ich, wer will, dass sich die Leute hier die Mühe machen, seinen Code zu verstehen und zu verbessern, sollte ihn mit strict versehen und vernünftig einrücken. Das wäre nämlich das erste, was ich machen würde, wenn ich verstehen wollte, was Du da machst.\n\n

<!--EDIT|Crian|1083946914-->
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
Netspider
 2004-05-07 20:21
#82082 #82082
User since
2003-09-25
49 Artikel
BenutzerIn
[Homepage] [default_avatar]
nachdem ich geprüft habe, welche dateien doppelt sind, habe ich im hash nur noch das geparste ergebnis, also nur noch a-z und ohne "the" und "feat" ...

da ich dateien so aber recht schlecht lösche kann, brauch ich da irgeneinen anderen weg, oder noch eine 2. schleife danach, aber wie!!
perl -e "s;;Ronny Lindner;;m;(..).$;;$l=$1;s;n;;g;m;.{4}$;;$_=$l;$I=$&;m;^(.);;$_.='ts';$_.=$1;$_++;$_++;$_.=$I;print ucfirst;"
Dubu
 2004-05-07 21:28
#82083 #82083
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Du brauchst nur eine etwas ausfuehrlichere Datenstruktur, z.B. einen Hash von Arrays:
Statt
Code: (dl )
$total{$file}++; # zum hash addieren

schreibst du
Code: (dl )
push @{$total{$file}}, $orifile; # Dateinamen zum Hash hinzufuegen

Die Dateinamen zum Hashindex $x befinden sich dann im Array @{$total{$x}}, die Anzahl der Dateien zu diesem Index - also das, was bei dir in $total{$x} drin ist - bekommst du durch scalar @{$total{$x}}.
[E|B]
 2004-05-07 23:39
#82084 #82084
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Außerdem würde ich mir die RegExps nochmal ganz genau anschauen. Die machen nämlich nicht genau das, was du willst.

Code: (dl )
$file =~ s/(th|ht)/t/ig;


Für was die Klammern?

Code: (dl )
$file =~ s/[^a-z]//ig;


Nö, damir schmeißt du alles außer a-z raus, aber nicht alle Sonderzeichen, wie du eigentlich willst. Werf lieber \W raus.
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
Netspider
 2004-05-08 10:35
#82085 #82085
User since
2003-09-25
49 Artikel
BenutzerIn
[Homepage] [default_avatar]
zur ersten regexp, ich dachte bei einem "oder" muss man das ganze in klammern angeben, damit perl weiß, wo das "oder" zuende ist

das mit dem a-z stimmt schon so, \W hatte ich als erstes probiert, da wird aber irgendwas nicht rausgehauen, was weg soll, weiß nicht mehr was.

ich werd mir jetzt mal die hasharrays anschauen, wusst ich nicht, dass es das gibt!

[edit]
es klappt ja wirklich *g*

danke!!!
[/edit]\n\n

<!--EDIT|Netspider|1083999161-->
perl -e "s;;Ronny Lindner;;m;(..).$;;$l=$1;s;n;;g;m;.{4}$;;$_=$l;$I=$&;m;^(.);;$_.='ts';$_.=$1;$_++;$_++;$_.=$I;print ucfirst;"
Strat
 2004-05-08 11:44
#82086 #82086
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=Netspider,08.05.2004, 08:35]zur ersten regexp, ich dachte bei einem "oder" muss man das ganze in klammern angeben, damit perl weiß, wo das "oder" zuende ist[/quote]
allerdings wuerde ich da statt m/(ht|th)/, was den Wert in $1 speichert, eher m/(?:ht|th)/ schreiben, was das gleiche bedeutet, aber durch das ?: nur das innerhalb gruppiert und nicht in $1 speichert (clustering, not capturing).

(aber ohne klammern funktioniert es auch, weil hier sonst nichts anderes im pattern vorkommt...)

?: hat auch noch nette optionen:
(?i:ht|th) sucht von gross-/Kleinschreibung unabhaengig, was bei komplexeren Ausdruecken gegenüber von m/.../i von vorteil sein kann, weil da die gross-/Kleinschreibung-egal nur fuer den gewaehlten bereich aktiviert wird, und so nicht so viele optimierungsmoeglichkeiten der RE-Engine kaputt macht

siehe perlre
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Netspider
 2004-05-08 15:08
#82087 #82087
User since
2003-09-25
49 Artikel
BenutzerIn
[Homepage] [default_avatar]
danke für die tipps, das mit ?i: wusste ich noch nicht, ich hab jetzt die lc($file) zeile an den anfang gelegt, damit fallen die ganzen /i weg.

jetzt isses tool perfekt *g*

übrigens, die mp3s hab ich mir mit > air2mp3 < geholt - alles legal!!\n\n

<!--EDIT|Netspider|1084028176-->
perl -e "s;;Ronny Lindner;;m;(..).$;;$l=$1;s;n;;g;m;.{4}$;;$_=$l;$I=$&;m;^(.);;$_.='ts';$_.=$1;$_++;$_++;$_.=$I;print ucfirst;"
betterworld
 2004-05-08 16:35
#82088 #82088
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Pass aber auf und mach dir eine Sicherheitskopie vorher... Ich habe neulich ein Script geschrieben, um MP3s reihenweise umzubenennen, und habe es aus versehen auf mein Homeverzeichnis losgelassen... das hat dan zu 119 total verstellten Dateinamen gefuehrt
Netspider
 2004-05-08 18:54
#82089 #82089
User since
2003-09-25
49 Artikel
BenutzerIn
[Homepage] [default_avatar]
ich hab das script ein verzeichnis über dem mp3ordner, und bis jetzt gabs keine probleme
war dein script fehlerhaft oder woran lags?
perl -e "s;;Ronny Lindner;;m;(..).$;;$l=$1;s;n;;g;m;.{4}$;;$_=$l;$I=$&;m;^(.);;$_.='ts';$_.=$1;$_++;$_++;$_.=$I;print ucfirst;"
<< |< 1 2 3 >| >> 30 Einträge, 3 Seiten



View all threads created 2004-05-07 19:35.