The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Имена файлов из koi8-r в win1251"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы OpenNET: Виртуальная конференция (Public)
Изначальное сообщение [Проследить за развитием треда]

"Имена файлов из koi8-r в win1251" 
Сообщение от jr emailИскать по авторуВ закладки(ok) on 21-Апр-05, 14:45  (MSK)
Нужно конвертировать ИМЕНА файлов (включая каталоги) в заданной директории из koi8-r в win1251 причем рекурсивно.
Дайте направление куда копать.

FreeBSD 4.11

  Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "Имена файлов из koi8-r в win1251" 
Сообщение от denn emailИскать по авторуВ закладки(??) on 21-Апр-05, 15:30  (MSK)
>Нужно конвертировать ИМЕНА файлов (включая каталоги) в заданной директории из koi8-r в
>win1251 причем рекурсивно.
>Дайте направление куда копать.
>
>FreeBSD 4.11

когда-то делал...
что типа ls | xargs -I % ls -l % | konwert cp866-koi8r
погляди в эту сторону

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "Имена файлов из koi8-r в win1251" 
Сообщение от jr emailИскать по авторуВ закладки(ok) on 21-Апр-05, 17:55  (MSK)
В общем, наваял скрипт perl, использует программу iconv:

----------
#!/usr/bin/perl

use strict;

my $path = @ARGV[0];
my $cfrom = $ARGV[1];
my $cto = $ARGV[2];
my $file = "";
my $name = "";
my $newname = "";

$path =~ s|/$||;

foreach $file ( sort { ( $b =~ s|/|/|g ) <=> ( $a =~ s|/|/|g ) } `find $path -regex "$path/.*" -pri
nt` ) {
   chomp $file;
   $file =~ m|(.+/)(.+)$|;
   $path = $1;
   $name = $2;
   $newname = `echo "$name" | iconv -f $cfrom -t $cto`;
   chomp $newname;
   rename ( "$path$name", "$path$newname" );
   print "$path $name -> $newname\n";
}
----------

параметры в командной сторке:
1 - путь
2 - из какой кодировки (KOI8-R, CP1251, и т.д.)
3 - в какую кодировку (KOI8-R, CP1251, и т.д.)

сортировка в цикле foreach предназначена для того, чтобы сначала переименовывались файлы самые глубокие в дереве каталогов

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "Имена файлов из koi8-r в win1251" 
Сообщение от lavr emailИскать по авторуВ закладки on 21-Апр-05, 18:31  (MSK)
>В общем, наваял скрипт perl, использует программу iconv:
>
>----------
>#!/usr/bin/perl
>
>use strict;
>
>my $path = @ARGV[0];
>my $cfrom = $ARGV[1];
>my $cto = $ARGV[2];
>my $file = "";
>my $name = "";
>my $newname = "";
>
>$path =~ s|/$||;
>
>foreach $file ( sort { ( $b =~ s|/|/|g ) <=> ( $a =~ s|/|/|g ) } `find $path -regex "$path/.*" -pri
>nt` ) {
>   chomp $file;
>   $file =~ m|(.+/)(.+)$|;
>   $path = $1;
>   $name = $2;
>   $newname = `echo "$name" | iconv -f $cfrom -t
>$cto`;
>   chomp $newname;
>   rename ( "$path$name", "$path$newname" );
>   print "$path $name -> $newname\n";
>}
>----------
>
>параметры в командной сторке:
>1 - путь
>2 - из какой кодировки (KOI8-R, CP1251, и т.д.)
>3 - в какую кодировку (KOI8-R, CP1251, и т.д.)
>
>сортировка в цикле foreach предназначена для того, чтобы сначала переименовывались файлы самые
>глубокие в дереве каталогов


а сожрет он имена файлов с пробелами и/или спецсимволами?

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "Имена файлов из koi8-r в win1251" 
Сообщение от baby11 emailИскать по авторуВ закладки(??) on 22-Апр-05, 08:41  (MSK)
>>В общем, наваял скрипт perl, использует программу iconv:
>>
>>----------

Есть такая тулза convmv какраз для этого и предназначена
http://j3e.de/linux/convmv/


About:
convmv converts filenames (not file content), directories, and even whole filesystems to a different encoding. This comes in very handy if, for example, one switches from an 8-bit locale to an UTF-8 locale or changes charsets on Samba servers. It has some smart features: it automagically recognises if a file is already UTF-8 encoded (thus partly converted filesystems can be fully moved to UTF-8) and it also takes care of symlinks. Additionally, it is able to convert from normalization form C (UTF-8 NFC) to NFD and vice-versa. This is important for interoperability with Mac OS X, for example, which uses NFD, while Linux and most other Unixes use NFC. Though it's primary written to convert from/to UTF-8 it can also be used with almost any other charset encoding. Convmv can also be used for case conversion from upper to lower case and vice versa with virtually any charset. Note that this is a command line tool which requires at least Perl version 5.8.0.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "Имена файлов из koi8-r в win1251" 
Сообщение от jr emailИскать по авторуВ закладки(ok) on 22-Апр-05, 09:18  (MSK)
>Есть такая тулза convmv какраз для этого и предназначена
>http://j3e.de/linux/convmv/
>
>
>About:
>convmv converts filenames (not file content), directories, and even whole filesystems to
>a different encoding. This comes in very handy if, for example,
>one switches from an 8-bit locale to an UTF-8 locale or
>changes charsets on Samba servers. It has some smart features: it
>automagically recognises if a file is already UTF-8 encoded (thus partly
>converted filesystems can be fully moved to UTF-8) and it also
>takes care of symlinks. Additionally, it is able to convert from
>normalization form C (UTF-8 NFC) to NFD and vice-versa. This is
>important for interoperability with Mac OS X, for example, which uses
>NFD, while Linux and most other Unixes use NFC. Though it's
>primary written to convert from/to UTF-8 it can also be used
>with almost any other charset encoding. Convmv can also be used
>for case conversion from upper to lower case and vice versa
>with virtually any charset. Note that this is a command line
>tool which requires at least Perl version 5.8.0.

спасибо, уже не нужно, но будем знать :)

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "Имена файлов из koi8-r в win1251" 
Сообщение от jr emailИскать по авторуВ закладки(ok) on 22-Апр-05, 09:17  (MSK)
>а сожрет он имена файлов с пробелами и/или спецсимволами?

пробелы, скобки съедает точно, а на счет спецсимволов не знаю - не пробовал

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

7. "Имена файлов из koi8-r в win1251" 
Сообщение от madskull Искать по авторуВ закладки(ok) on 22-Апр-05, 10:59  (MSK)
>В общем, наваял скрипт perl, использует программу iconv:
----[cut]-----
>
А зачем такие сложности?
find | sort -r | while read f; do nf=$(echo $n|iconv -f koi8-r -t windows-1251); [ "$f" = "$nf" ] || mv "$f" "$nf"; done

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

8. "Имена файлов из koi8-r в win1251" 
Сообщение от madskull Искать по авторуВ закладки(ok) on 22-Апр-05, 11:08  (MSK)
>>В общем, наваял скрипт perl, использует программу iconv:
>----[cut]-----
>>
>А зачем такие сложности?
>find | sort -r | while read f; do nf=$(echo $n|iconv -f
>koi8-r -t windows-1251); [ "$f" = "$nf" ] || mv "$f"
>"$nf"; done

Поторопился...

find ! -type d | while read f; do
   fn=$(basename "$f"|iconv -f koi8-r -t windows-1251);
   [ "$fn" = "$(basename "$f")" ] || mv "$f" "$(dirname "$f")/$fn";
done
Это если не переименовывать каталоги...

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

9. "Имена файлов из koi8-r в win1251" 
Сообщение от jr emailИскать по авторуВ закладки(ok) on 22-Апр-05, 11:40  (MSK)
>>>В общем, наваял скрипт perl, использует программу iconv:
>>----[cut]-----
>>>
>>А зачем такие сложности?
>>find | sort -r | while read f; do nf=$(echo $n|iconv -f
>>koi8-r -t windows-1251); [ "$f" = "$nf" ] || mv "$f"
>>"$nf"; done
>
>Поторопился...
>
>find ! -type d | while read f; do
>   fn=$(basename "$f"|iconv -f koi8-r -t windows-1251);
>   [ "$fn" = "$(basename "$f")" ] || mv "$f"
>"$(dirname "$f")/$fn";
>done
>Это если не переименовывать каталоги...

вот когда избавишься от всех "если", скритп обретет сложность :)))

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

10. "Имена файлов из koi8-r в win1251" 
Сообщение от madskull Искать по авторуВ закладки(ok) on 22-Апр-05, 12:10  (MSK)

>>find ! -type d | while read f; do
>>   fn=$(basename "$f"|iconv -f koi8-r -t windows-1251);
>>   [ "$fn" = "$(basename "$f")" ] || mv "$f"
>>"$(dirname "$f")/$fn";
>>done
>>Это если не переименовывать каталоги...
>
>вот когда избавишься от всех "если", скритп обретет сложность :)))

А каталоги тоже надо? Практически то же самое :)

find | sort -r | while read f; do
  fn=$(basename "$f"|iconv -f koi8-r -t windows-1251);
  [ "$fn" = "$(basename "$f")" ] || mv "$f" "$(dirname "$f")/$fn";
done

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

11. "Имена файлов из koi8-r в win1251" 
Сообщение от jr emailИскать по авторуВ закладки(ok) on 22-Апр-05, 12:58  (MSK)
>А каталоги тоже надо? Практически то же самое :)
>
>find | sort -r | while read f; do
>  fn=$(basename "$f"|iconv -f koi8-r -t windows-1251);
>  [ "$fn" = "$(basename "$f")" ] || mv "$f" "$(dirname
>"$f")/$fn";
>done

ну тогда на shell пусть будет так :)

#!/bin/sh
find $1 -regex "$1/.*" | sort -r | while read f; do
   fb=$(basename "$f");
   fd=$(dirname "$f");
   nfb=$(echo "$fb"|iconv -f $2 -t $3);
   [ "$fb" = "$nfb" ] || (mv "$fd/$fb" "$fd/$nfb"; echo "$fd $fb -> $nfb";)
done

аргумент 1 - путь
аргумент 2 - из какой кодировки
аргумент 3 - в какую кодировку

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх


Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ]
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.



  Закладки на сайте
  Проследить за страницей
Created 1996-2017 by Maxim Chirkov  
ДобавитьРекламаВебмастеруГИД  
Hosting by Ihor