Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование в *nix (http://forum.oszone.net/forumdisplay.php?f=35)
-   -   [BASh] Рекурсивный обход с переименованием (http://forum.oszone.net/showthread.php?t=285272)

blackmane 18-07-2014 17:58 2378077

[BASh] Рекурсивный обход с переименованием
 
Доброго дня!

Обратился пользователь с проблемой, в сетевой папке у большинства файлов с кириллическим названием слетела кодировка.



Сами файлы не повреждены, только имена.
Сетевой ресурс находится на машинке с Ubuntu Server 12.04

Помучившись я пришел к такой строчке:
Код:

iconv -f utf8 -t cp437 -c
Она конвертирует из этих кракозябр в человеческий вид.
Осталось автоматизировать, с файлами проблем не возникло:

Код:

find * -type f | while read line;do
name=`echo $line| awk -F"/" '{print $NF}'`;
fname=`echo $name |iconv -f utf8 -t cp437 -c`;
dname=`echo $line | sed "s/[^/]*$//"`;
fullname="$dname$fname";
echo $fullname;
mv "$line" "$fullname";
done;

С первым уровнем папок тоже проблем не было:
Код:

find * -type d | grep -v "/" | while read line;do
name=`echo $line| awk -F"/" '{print $NF}'`;
fname=`echo $name |iconv -f utf8 -t cp437 -c`;
dname=`echo $line | sed "s/[^/]*$//"`;
fullname="$dname$fname";
echo $fullname;
mv "$line" "$fullname";
done;

А вот с вложенными увы проблема.
Число вложенных папок варьируется от 1 до 50+ и результат такого скрипта:

Код:

find * -type d | grep  "/" | while read line;do
name=`echo $line| awk -F"/" '{print $NF}'`;
fname=`echo $name |iconv -f utf8 -t cp437 -c`;
dname=`echo $line | sed "s/[^/]*$//"`;
fullname="$dname$fname";
echo $fullname;
mv "$line" "$fullname";
done;

Переименование только второго уровня, изначально мне казалось что он сработает только на последний уровень.

Вся проблема в том, что при переборе переименовывается родительская папка, следовательно дочерние не доступны.

А повторное использование iconv либо оставляет вообще непонятные знаки, либо файлы "исчезают" (они становятся безымянными).

Может у кого нибудь был такой опыт?

User001 21-07-2014 09:30 2379163

convmw посмотрите...

Еще как вариант ваш код обернуть циклами и менять кодировку начиная с максимальной глубины, но велосипед получился медленный и некрасивый :)

blackmane 22-07-2014 12:13 2379650

Цитата:

Цитата User001
convmw посмотрите... »

Спасибо, добрый человек, выручил, все получилось.
В отличии от моего варианта он выдает ошибку на имена с кодировкой отличной от указанной (-t), т.е. не делает:
Цитата:

Цитата blackmane
А повторное использование iconv либо оставляет вообще непонятные знаки, либо файлы "исчезают" (они становятся безымянными). »

И также он выдает ошибку на такой вариант:

Но с этим мы быстро справились :-)
Цитата:

Цитата User001
Еще как вариант ваш код обернуть циклами и менять кодировку начиная с максимальной глубины, но велосипед получился медленный и некрасивый »

Я так и хотел сделать, вот только проблема была в том, что я не мог определить максимальную глубину.

Первый раз я допустил ошибку и прошелся по корню, благо там кириллицы не было

User001 22-07-2014 12:25 2379657

Цитата:

Цитата blackmane
Я так и хотел сделать, вот только проблема была в том, что я не мог определить максимальную глубину. »

Ну, сначала поискать методом подсчета "/" :) Вряд ли у вас вложенность больше 10-20...


Время: 15:28.

Время: 15:28.
© OSzone.net 2001-