LINUX.ORG.RU
ФорумAdmin

Изменение кодировки имен файлов


0

0

Прошу помощи. 

Задача состоит в том, чтобы перевести имена файлов и каталогов из
одной кодировки в другую. Может у кого есть совет или готовое решение?

В FAQ сказано только про перевод содержимого файлов, а не их названий... 

Я наваял вот это, по идее должно работать. При строчке в тексте  
iconv -f UTF8 -t UTF8 просто проходит по всему дереву каталогов и 
меняет имена файлов и каталогов с добавлением к их названию "_NEW".
Еслиже подсунуть вот такой iconv -f UTF8 -t KOI8-R, то скрипт не
работает и создает не те каталоги и не там. Подозрение на работу с
регулярными выражениями. Бился вчера пол дня.

#!/usr/bin/perl -w

use strict;

my @files = `du -a ./начало | awk '{ print \$2}' | sort`;
my $value;
my $new_name;
my $count = $#files;
my $i;
my $j;

for($i=0;$i<=$#files;$i++)
{
    $value = $files[$i];
    chomp $value;
    print $value . "\n";
    $new_name = `echo "$value" | iconv -f UTF8 -t KOI8-R`;
    chomp $new_name;
    $new_name .= "_NEW";
    print ">>> " . $new_name . "\n";
    rename($value,$new_name);
    for($j=$i+1;$j<=$#files;$j++)
    {
        $files[$j] =~ s{$value}{$new_name};
    }
}

exit();

Да, тестовое дерово создал при помощи вот этого
#!/bin/sh

PATH="./начало";

/bin/rm -rf $PATH;
/bin/mkdir $PATH;

for i in 1 2 ; do
   /bin/mkdir "$PATH/уровень_$i";
    for j in 1 2 3 ; do
        /bin/mkdir "$PATH/уровень_$i/уровень_$i-$j";
        for k in 1 2 3 4; do
            /bin/mkdir "$PATH/уровень_$i/уровень_$i-$j/уровень_$i-$j-$k";
            for l in 1 2 3 4 5; do
                :> "$PATH/уровень_$i/уровень_$i-$j/уровень_$i-$j-$k/файл_$i-$j-$k-$l.txt"
;
                echo "Тестовый текст UTF-8" >> "$PATH/уровень_$i/уровень_$i-$j/уровень_$i-$j-$k/файл_$i-$j-$k-$l.txt"
;
                echo "$i-$j-$k-$l" >> "$PATH/уровень_$i/уровень_$i-$j/уровень_$i-$j-$k/файл_$i-$j-$k-$l.txt"
;
                echo "" >> "$PATH/уровень_$i/уровень_$i-$j/уровень_$i-$j-$k/файл_$i-$j-$k-$l.txt"
;
            done
        done
    done
done





алгоритм кривой

`du -a ./начало | awk '{ print \$2}' | sort` отображает дерево с корня, а тебе надо с ветвей.

borisych ★★★★★
()
Ответ на: комментарий от borisych

Нет, в этом смысле все нормально, проблема именно с регулярными выражениями. $files[$j] =~ s{$value}{$new_name}; Имена в новой кодировке не обрабатываются правильно. А если просто в тойже кодировке модифицировать имена - то все работает. Проверял.

boatman
() автор топика

Может сначала переименовать, так чтобы в пути были только цифры, с сохранением соответствия между новым путем и старым в файле? А затем еще раз переименовать

anonymous
()
Ответ на: комментарий от jackill

Вот! Пришло просветвление!! Раз проблема в регулярных выражениях, 
то зачем их использовать? Решил сделать через рекурсию =)
Bсе работает! УРА!!! =)

P.S. 2jackill: спасибо за ссылку, сейчас поковыряюсь. 
Просто когда я его читал в прошлый раз (пару месяцев назад), 
там вроде не было этого? ;) Хотя могу ошибаться.

#!/usr/bin/perl -w

use strict;

my $PATH = "./начало";
my $FROM = "UTF8";
my $TO   = "WINDOWS-1251";

sub convert(){
my $name;
my $new_name;
my $dir = pop @_;
my @list = `ls $dir`;
my $type;
my $body;

    foreach $name(@list)
    {
        chomp $name;
        print "<< $dir/$name\n";
        $type = `file $dir/$name`;
        if($type =~ /directory$/)
        {
            &convert("$dir/$name");

        }elsif($type =~ /text$/)
        {
            $body = `iconv -f $FROM -t $TO $dir/$name`;
            open(FILE,">$dir/$name");
            print FILE "$body";
        }
        $new_name = `echo "$name" | iconv -f $FROM -t $TO`;
        chomp $new_name;
#       $new_name .= "_N";
        rename("$dir/$name","$dir/$new_name");
        print ">> $dir/$new_name\n";
    }
}

my $new_path = `echo "$PATH" | iconv -f $FROM -t $TO`;
chomp $new_path;
#$new_path .= "_N";

&convert($PATH);
rename($PATH,$new_path);
print ">> $new_path\n";

print "ok\n";
exit();

boatman
() автор топика
Ответ на: комментарий от boatman

find /home/path | while read a; do mv "$a" "new_`echo $a | iconv -fkoi8-r -tutf8`"; done

anonymous2 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.