Cleanup Filenames (Perl script)

Το 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/
Dir not found.

Παρακάτω είναι ο κώδικας.

Προσοχή!!

Για να παίξει σωστά, φροντίστε στο αρχείο που θα σώσετε το script να έχει encoding iso-8859-7, διαφορετικά δε θα γίνει σωστά η μετατροπή ή κατεβάστε το original αρχείο από εδώ: http://quasar.dnsalias.com/~eleni/cleanup_filenames

#!/usr/bin/perl

################################
# cleanup_filenames.pl
# author: hikiko
################################

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 "Dir not found.n";
}


Advertisements
Cleanup Filenames (Perl script)

4 thoughts on “Cleanup Filenames (Perl script)

  1. Μπράβο για το πρόγραμμα εντολών.

    Αναφέρεσαι σε αρχική κωδικοποίηση iso-8859-7.
    Μπορείς να δώσεις ένα παράδειγμα που κάποιος έχει τέτοια αρχεία στην κωδικοποίηση αυτή; Με μια πρόσφατη διανομή με κωδικοποίηση συστήματος UTF-8, νομίζω ότι τα ελληνικά ονόματα, όταν φαίνονται ως ελληνικά, είναι πάντα σε κείμενο UTF-8 (είτε πραγματικά UTF-8, είτε από μετατροπή λόγω παραμέτρου κατά την προσάρτηση).

    Like

    1. Δεν κατάλαβα τι ρωτάς ακριβώς. Το πρόγραμμα κάνει το εξής:
      $./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 μπερδεύεται 🙂 δεν έχει καμιά σχέση με τα υπόλοιπα και με το πώς τρέχει το πρόγραμμα… 🙂

      Like

    2. Χαμαιλεοντειο Φολιδοκαυλο Γαλαξιακο Σεληνιασμενο Ψωλοροπαλοφορο Γαμωδρακακι-Κουταβι. says:

      YES!

      ΤΟ ΑΠΟΚΩΔΙΚΟΠΟΙΗΣΑ!

      Εννοει “by character conversion due to a mount-time parameter”

      Ε ειμαι θεος!

      Like

      1. Aφού όλοι καταλαβαίνουν ποιος είσαι γιατί δε βάζεις κανένα nickname της προκοπής?
        Bάνδαλε…

        Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s