Schrift
[thread]11076[/thread]

Datei- und Verzeichnisnamen umwandeln



<< >> 9 Einträge, 1 Seite
tuxstef
 2007-12-29 09:04
#104231 #104231
User since
2007-12-28
2 Artikel
BenutzerIn
[default_avatar]
Hallo!

Kann man dieses "grauenhafte" Script besser schreiben?

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
#!/usr/bin/perl

START:
my @files = `find $ARGV[0] -true`;

foreach(@files) {
  #Am Ende einer jeden Zeile bef. sich ein Zeichen, dass nicht benötigt wird
  chop ($_);
  my $fnold = $_;
  #Das könnte man vielleicht besser schreiben, aber ich weiß nicht wie.
  #Die dateien können nicht ohne Sonderzeichen - Escaping umbenannt werden.
  #Linke Seite vom Befehl mv datei_old datein_new  
  $fnold =~ s/\s/\\ /g;
  $fnold =~ s/,/\\,/g;
  $fnold =~ s/'/\\'/g;
  $fnold =~ s/`/\\`/g;
  $fnold =~ s/\(/\\(/g;
  $fnold =~ s/\)/\\)/g;
  $fnold =~ s/\?/\\?/g;
  $fnold =~ s/\!/\\!/g;
  $fnold =~ s/\&/\\&/g;
   #Rechte Seite von mv.
  #Die ungewünschten Zeichen werden entfernt.
  $_ =~ s/\s/_/g;
  $_ =~ s/[^a-zA-Z0-9_\/\.\s-]//g;
  
  
  if ( $fnold ne $_)  {
  
  print "$fnold -> $_\n";
  system ("mv $fnold $_");
  #Da auch Verzeichnisse umben. werden, gibts Probleme -> Neu einlesen.
  goto START;

  }
}


Bitte um Hilfe!
renee
 2007-12-29 12:23
#104236 #104236
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Was ist genau das Ziel?

goto ist nicht so toll, zum Finden von Dateien gibt es z.B. CPAN:File::Find, zum Verschieben gibt es CPAN:File::Copy.

Das goto kann man durch eine while-Schleife ersetzen. So wie es jetzt ist, ist es eine Endlosschleife. Ist das so gewollt?

Wenn Du ein Modul nimmst, wird auch das ganze Escaping von Shell-Sonderzeichen unnötig (sollte es zumindest).
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/
ptk
 2007-12-29 12:39
#104239 #104239
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Statt system("mv ...") kann man auch einfach nur rename nehmen, da braucht man kein Modul, solange man nicht über Filesystemgrenzen hinweg umbenennt.
RPerl
 2007-12-29 12:57
#104241 #104241
User since
2006-11-26
384 Artikel
BenutzerIn

user image
Uebrigens ist das was Du in Zeile 04 machst nicht unbedingt eine gute Idee.
Ist Sicherheitskritisch.

Code: (dl )
1
2
$ perl -e 'print `find $ARGV[0] -true`' "--h`uname -r`"
Unrecognized switch: --h2.6.22.13-0.3-default (-h will show valid options).


Je nach dem wo / wann / von wem das Script ausgefuehrt wird bzw. wer welche Berechtigung darauf hat.
tuxstef
 2007-12-30 22:32
#104284 #104284
User since
2007-12-28
2 Artikel
BenutzerIn
[default_avatar]

Wenn Du ein Modul nimmst, wird auch das ganze Escaping von Shell-Sonderzeichen unnötig (sollte es zumindest).


Leider NICHT ....
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
foreach(@foundfiles) {

  if ( -d $_ ) {

  print "directory\n";

  }

  $ofn = $_;

  $_ = lc ($_);
  $_ =~ s/\s/_/g;
  $_ =~ s/[^a-zA-Z0-9_\/\.\s-]//g;

  print "$ofn -> $_\n";
  
  
  #move("te\ st","te_st") or die $!;
  move($ofn,$_) or die $!;
  



}


Gibt es da eine Funktion zum automatischen escapen von diesen grauslichen Leerzeichen und "Sonder-Hakel"?

Suche dann soetwas:

Code (perl): (dl )
1
2
3
funktionsname_in_perl ($_,Sonderzeichen_dass_escaped_werden_muss);

$_ =~ s/Sonderzeichen_dass_escaped_werden_muss/\\Sonderzeichen_dass_escaped_werden_muss/g;


für das file rename.

Bitte um Hilfe.
renee
 2008-12-31 12:26
#104307 #104307
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
perldoc -f quotemeta
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/
Strat
 2008-12-31 13:07
#104309 #104309
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
tuxstef+2007-12-30 21:32:33--
Gibt es da eine Funktion zum automatischen escapen von diesen grauslichen Leerzeichen und "Sonder-Hakel"?


Ja, und zwar sogar eins, das die ganzen Betriebssystem-Unterschiede kennt. Es nennt sich CPAN:File::Spec und ist im Perl-Core dabei.

Code (perl): (dl )
1
2
my $file = File::Spec->catfile( $dir1, $dir2, $filename );
my $dir = File::Spec->catdir( $dir1, $dir2 );


wenn ich z.B. fuer ein Script ein eigenes Modulverzeichnis habe, das in ../lib liegt, dann fuege ich das folgendermaszen zu @INC hinzu:
Code (perl): (dl )
1
2
3
4
use FindBin;
use File::Spec;

use lib File::Spec->catdir( $FindBin::Bin, '../lib' );
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
ptk
 2008-12-31 13:28
#104311 #104311
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Müsstest du nicht mit File::Spec->updir arbeiten, um komplett portabel zu sein?
Strat
 2008-01-01 14:54
#104331 #104331
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
@ptk: stimmt, das waere noch sicherer.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< >> 9 Einträge, 1 Seite



View all threads created 2007-12-29 09:04.