script zum umbenennen von dateinamen

S

supersucker

Foren Gott
hi,

nachdem mein k3b andauernd mit dateinamen nicht klar kommt, die sonderzeichen haben oder zu lang sind (obwohl rock ridge und joliet extensions aktiviert sind und ich ja noch gefragt werde ob ich die namen entsprechend gekürzt haben, kackt k3b dann vorm brennen trotzdem ab) , wollte ich fragen ob jemand ein programm / script kennt, das zb. ein verzeichnis als eingabe nimmt und dann einfach alle dateinamen die in diesem verzeichnis sind in ein "brennfreundliches" format bringt, also sonderzeichen entfernt, name kürzt usw.....

hab bisher detox gefunden, das kann ich aber nicht kompilieren da make wie folgt abbricht (nachdem configure fehlerfrei durchgelaufen ist):

Code:
gcc -c -g -O2 table.c
gcc -c -g -O2 parse_table.c
gcc -c -g -O2 config_file_l.c
gcc -c -g -O2 config_file_y.c
gcc -c -g -O2 parse_options_getopt.c
gcc -c -g -O2 parse_options_generic.c
gcc -o detox detox.o clean_string.o file.o table.o parse_table.o config_file_l.o config_file_y.o parse_options_getopt.o parse_options_generic.o
config_file_l.o: In function `yylex':
/home/jollyroger/Desktop/tmp/detox/detox-1.2.0-rc1/lex.yy.c:915: undefined reference to `yywrap'
collect2: ld returned 1 exit status
make: *** [detox] Error 1

kennt jemand noch ein anderes programm / und oder kann mit dem make-error was anfangen?

danke für jeden tip
 
Ich hab mir mal vor längerer Zeit ein Perlskript für einen ähnlichen Zweck geschrieben. Ist wahrscheinlich nicht perfekter Code, da ich damals noch Perl gelernt habe. Benutzung auf eigene Gefahr! ;)

rename.pl:
PHP:
#!/usr/bin/perl

use File::Find;
use strict;
use utf8;
use vars qw/ %opt /;

sub convert;
sub init;
sub usage;

init;
for (@ARGV) {
	finddepth {wanted => \&convert, no_chdir => 0}, $_ if $opt{r};
	convert $_
}

##################################################
sub convert {
	my $newfilename = (my $filename = $_);
	my %subst = ('Ä' => 'Ae', 'Ö' => 'Oe', 'Ü' => 'Ue', 'ä' => 'ae',
		'ö' => 'oe', 'ü' => 'ue', 'ß' => 'ss', '\s' => '_', '\.(?=.*\.)' => '_');
	for (keys %subst){
		$newfilename =~ s/$_/$subst{$_}/g
	}
	$newfilename =~ s/[^\w\-\.\/]//g;
	$newfilename = lc $newfilename if $opt{l};
	if ((-e $filename) && (!-f $newfilename) && ($filename ne $newfilename)) {
		print "$filename -> $newfilename\n";
		my $yesno;
		if (! $opt{f}) {
			do {
				print "[y/n]: ";
				chomp($yesno = <STDIN>)
			} while ($yesno !~ /^y|n$/i)
		}
		rename "$filename", "$newfilename" if ($opt{f} || ($yesno =~ /y/i))
	} elsif ($opt{v}) {
		print "no conversion: $filename\n"
	}
}

##################################################
sub init {
	use Getopt::Std;
	my $opt_string = 'fhlrv';
	getopts ("$opt_string", \%opt) or usage;
	usage() if $opt{h};
}

##################################################
sub usage {
	(my $program = $0) =~ s!.*?/!!g;
	print STDERR << "EOF";

This program converts file/dir names.

usage: $program [-fhlrv] files/dirs

	-f        : force
	-h        : this (help) message
	-l        : convert to lower case
	-r        : recursive
	-v        : verbose

EOF
	exit
}

edit: Kleine Korrektur
 
Zuletzt bearbeitet:
Phorus war schneller, aber ich hab da auch grade ne Kleinigkeit zusammengebastelt.
Du musst nur
$dirname und $max_length anpassen und das Ganze dann ausfuehren.
Es werden alle Zeichen bis auf alphanumerische Zeichen, Unterstrich und Punkt aus dem Dateinamen entfernt, dann falls noetig gekuerzt, wobei die Endung erhalten bleibt.
Falls eine Datei mit eben diesem Namen schon existiert wird sie nicht ueberschrieben.
Diese Dateien muessen dann im Nachinein noch per Hand rename'd werden.
Solltest du also viele Dateien mit gleichem Anfang haben à la "artist_song1.mp3, artist_song2.mp3 ..." muesstest du noch eine entsprechende Anpassung vornehmen.

Ach ja, und vorher immer Backups machen ;-)

Code:
#!/usr/bin/perl -w

use strict;
use warnings;

my $dirname = '/home/foo/bar';
my $max_length = 8;

my $file;

opendir(DIR, $dirname) or die "can't opendir $dirname: $!\n";

while(defined($file = readdir(DIR)))
{
	next if $file =~ /^\.\.?$/;
	my $oldname = $file;
	$file =~ s/[^\w\.]//g;
	if(length($file) > $max_length)
	{
		my $ext;
		if($file =~ /\.\w+$/)
		{
			$ext = $&;
		}
		($max_length - length($ext) > 0) ? ($file = substr($file, 0, $max_length - length($ext)).$ext) : 
											($file = substr($file, 0, $max_length));
	}
	rename($dirname."/".$oldname, $dirname."/".$file) or warn "couldn't rename $oldname to $file: $!\n" 
		unless (-e $dirname."/".$file);
}


closedir(DIR);

print "all done... exiting\n";

Gruß
Nic
 
danke für eure mühen....

ja, mein perl ist auch schon ne weile her, aber ich denke mal ich werde mir ein eigenes script schreiben, das auf euren beiden aufbaut.....ein bestimmtes lizenzmodell werd ich bei euren scripten nicht beachten müssen, oder?....:-)

ne, was ich halt gern noch hätte wäre das ich dem script nur einen ordner gebe und das ding dann halt auch noch alle evtl. enthaltenen unterordner mit durchgeht......
kann mir nicht schaden meine perl-kenntnisse wieder aufzufrischen......

danke soweit!
 
Verschoben nach Shell-Skripte.

MFG

Dennis
 

Ähnliche Themen

kompilier problem

probleme bei emergen von x11-libs/libview

AirSnort unter Suse 10.3

tilp lässt sich nicht installieren

XMMS + Last.FM

Zurück
Oben