Cleanup Filenames (Perl script)
Μαΐου 20, 2009
Το scriptaki αυτό μετονομάζει τα αρχεία ενός directory μετατρέποντας τα ελληνικά σε greeklish, τα κενά σε underscores και τα κεφαλαία σε μικρά χωρίς να πειράζει τους υπόλοιπους χαρακτήρες. Μπορεί να χρησιμοποιηθεί σε ISO-8859-7 και UTF-8 filenames μόνο. Για να τρέξει χρειάζεται Perl και chmod +x cleanup_filenames
Παραδείγματα:
Directory με αρχεία που θέλουμε να μετονομάσουμε:
$ ls example_dir/
Ελληνικότατο FileνάMe.Txτ Λόλα Γλαδιόλα - Τεράστιο Souxe.Mp3
$ ./cleanup_filenames example_dir/
$ ls example_dir/
ellinikotato_filename.txt lola_gladiola-terastio_souxe.mp3
Λάθος directory:
$ ./cleanup_filenames wrong_dir/
Sorry dude. There is no such directory.
Παρακάτω είναι ο κώδικας.
Προσοχή!!
Για να παίξει σωστά, φροντίστε στο αρχείο που θα σώσετε το script να έχει encoding iso-8859-7, διαφορετικά δε θα γίνει σωστά η μετατροπή ή κατεβάστε το original αρχείο από εδώ: http://quasar.dnsalias.com/~eleni/cleanup_filenames
#!/usr/bin/perl
################################
# cleanup_filenames.pl
# author: Eleni Maria Stea
################################
use strict;
use Encode;
use File::Copy;
my $dir;
my @files;
my $file;
my $initfile;
my $flag;
$dir=$ARGV[0];
if ( -d $dir ) {
opendir (DIR,$dir) or die $!;
@files = (readdir DIR) or die $!;
closedir (DIR) or die $!;
foreach ( @files ) {
next if ( $_ eq "." || $_ eq ".." );
$file = $_;
$initfile = $_;
$flag = decode ("utf8",$_,Encode::FB_QUIET);
if ( $flag ) {
$file = encode("iso-8859-7",$flag);
}
$file =~ s/\s/_/g;
$file =~ s/θ/th/g;
$file =~ s/Θ/th/g;
$file =~ s/ψ/ps/g;
$file =~ s/Ψ/ps/g;
$file =~ tr/ΑΒΓΔΕΖΗΙΚΛΜΝΞΟΠΡΣΤΥΦΧΩΆΈΉΊΎΌΏΪΫαβγδεζηικλμνξοπρστυφχωάέήίύόώϋϊΰΐς/abgdeziiklmnxoprstyfhoaeiiyooiyabgdeziiklmnxoprstyfhoaeiiyooyiyis/;
$file =~s/_-_/-/g;
$file = "\L$file";
move("$dir$initfile","$dir$file") || die $!;
if ( $initfile eq $file ) {
print "Filename $initfile has not been changed.\n";
}
else {
print "Filename $initfile has been changed to $file.\n";
}
}
}
else {
print "Sorry dude. There is no such directory.\n";
}
Μαΐου 21, 2009 σε 6:35 μμ
Μπράβο για το πρόγραμμα εντολών.
Αναφέρεσαι σε αρχική κωδικοποίηση iso-8859-7.
Μπορείς να δώσεις ένα παράδειγμα που κάποιος έχει τέτοια αρχεία στην κωδικοποίηση αυτή; Με μια πρόσφατη διανομή με κωδικοποίηση συστήματος UTF-8, νομίζω ότι τα ελληνικά ονόματα, όταν φαίνονται ως ελληνικά, είναι πάντα σε κείμενο UTF-8 (είτε πραγματικά UTF-8, είτε από μετατροπή λόγω παραμέτρου κατά την προσάρτηση).
Μαΐου 23, 2009 σε 7:37 πμ
Δεν κατάλαβα τι ρωτάς ακριβώς. Το πρόγραμμα κάνει το εξής:
$./cleanup_filenames directory_name
και μετονομάζει όλα τα αρχεία στο directory directory_name έτσι που να μην περιέχουν κανένα ελληνικό χαρακτήρα, κανένα κεφαλαίο γράμμα και κανένα κενό.
(Τα ελληνικά γίνονται greeklish, τα κεφαλαία μικρά και τα κενά underscores.)
Επειδή τώρα τα ελληνικά ονόματα αρχείων μπορεί να έχουν είτε ISO είτε UTF κωδικοποίηση (ανεξάρτητα από την κωδικοποίηση που έχει το terminal ή ο filemanager που χρησιμοποιείς εσύ στο εκάστοτε λειτουργικό για να τα δεις) προτού κάνω τη μετονομασία ενός filename, ελέγχω αν η κωδικοποίηση του filename (όχι του περιεχομένου του αρχείου – την οποία δεν πειράζω) είναι well-formed UTF-8 και αν δεν είναι, θεωρώ ότι το αρχείο είναι ISO.
Για παράδειγμα αν έχω αυτά τα 2 αρχεία:
ελληνικό\ iso\ filename και
ελληνικό\ utf\ filename
(δε θα φαίνονται και τα 2 σωστά σε κάποιο terminal που έχει είτε iso είτε utf-8 encoding)
αφού τρέξεις το cleanup_filenames για το directory που τα περιέχει θα πάρεις αποτέλεσμα
elliniko_iso_filename
elliniko_utf_filename
Αυτά
Ελπίζω να σε κάλυψα…
btw σε λίγο θα ανεβάσω τη recursive έκδοση του cleanup_filenames για να κάνει το ίδιο και σε όλα τα subdirectories του directory…
Αααα, αν εννοείς που είπα να σώσεις το αρχείο με τον κώδικα σε ISO-8859-7, είναι για να δουλεύει σωστά μια εντολή που έχω μέσα με το ελληνικό αλφάβητο γιατί με τα bytes του UTF-8 μπερδεύεται
δεν έχει καμιά σχέση με τα υπόλοιπα και με το πώς τρέχει το πρόγραμμα…
Μαΐου 23, 2009 σε 4:35 μμ
YES!
ΤΟ ΑΠΟΚΩΔΙΚΟΠΟΙΗΣΑ!
Εννοει “by character conversion due to a mount-time parameter”
Ε ειμαι θεος!
Μαΐου 23, 2009 σε 8:26 μμ
Aφού όλοι καταλαβαίνουν ποιος είσαι γιατί δε βάζεις κανένα nickname της προκοπής?
Bάνδαλε…