Το scriptaki αυτό μετονομάζει τα αρχεία ενός directory μετατρέποντας τα ελληνικά σε greeklish, τα κενά σε underscores και τα κεφαλαία σε μικρά χωρίς να πειράζει τους υπόλοιπους χαρακτήρες. Μπορεί να χρησιμοποιηθεί σε ISO-8859-7 και UTF-8 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
Παρακάτω είναι ο κώδικας.
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 |
#!/usr/bin/perl use strict; use warnings; 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 "Dir not found.\n"; } |
Μπράβο για το πρόγραμμα εντολών.
Αναφέρεσαι σε αρχική κωδικοποίηση iso-8859-7.
Μπορείς να δώσεις ένα παράδειγμα που κάποιος έχει τέτοια αρχεία στην κωδικοποίηση αυτή; Με μια πρόσφατη διανομή με κωδικοποίηση συστήματος UTF-8, νομίζω ότι τα ελληνικά ονόματα, όταν φαίνονται ως ελληνικά, είναι πάντα σε κείμενο UTF-8 (είτε πραγματικά UTF-8, είτε από μετατροπή λόγω παραμέτρου κατά την προσάρτηση).
Δεν κατάλαβα τι ρωτάς ακριβώς. Το πρόγραμμα κάνει το εξής:
$./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 μπερδεύεται 🙂 δεν έχει καμιά σχέση με τα υπόλοιπα και με το πώς τρέχει το πρόγραμμα… 🙂
YES!
ΤΟ ΑΠΟΚΩΔΙΚΟΠΟΙΗΣΑ!
Εννοει “by character conversion due to a mount-time parameter”
Ε ειμαι θεος!
Aφού όλοι καταλαβαίνουν ποιος είσαι γιατί δε βάζεις κανένα nickname της προκοπής?
Bάνδαλε…