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

Ответить
 • Просмотры: 1
Аватара пользователя
blackmane

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

Сообщение blackmane »

Доброго дня!



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



Изображение



Сами файлы не повреждены, только имена.

Сетевой ресурс находится на машинке с 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

Re: [BASh] Рекурсивный обход с переименованием

Сообщение User001 »

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



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

Re: [BASh] Рекурсивный обход с переименованием

Сообщение User001 »

Цитата User001:



convmw посмотрите...
[BASh] Рекурсивный обход с переименованием




Спасибо, добрый человек, выручил, все получилось.

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


Цитата blackmane:



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




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

Изображение

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


Цитата User001:



Еще как вариант ваш код обернуть циклами и менять кодировку начиная с максимальной глубины, но велосипед получился медленный и некрасивый
[BASh] Рекурсивный обход с переименованием




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



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

Re: [BASh] Рекурсивный обход с переименованием

Сообщение User001 »

Цитата blackmane:



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




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

Вернуться в «Программирование в *nix»