Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Linux и FreeBSD » Программирование в *nix » [BASh] Рекурсивный обход с переименованием

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

Аватара для blackmane

Пользователь


Сообщения: 69
Благодарности: 0


Конфигурация

Профиль | Отправить PM | Цитировать


Доброго дня!

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



Сами файлы не повреждены, только имена.
Сетевой ресурс находится на машинке с 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 либо оставляет вообще непонятные знаки, либо файлы "исчезают" (они становятся безымянными).

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

Отправлено: 17:58, 18-07-2014

 

Аватара для User001

Ветеран


Сообщения: 740
Благодарности: 116

Профиль | Отправить PM | Цитировать


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

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

Последний раз редактировалось User001, 21-07-2014 в 09:50.


Отправлено: 09:30, 21-07-2014 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для blackmane

Пользователь


Сообщения: 69
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата User001:
convmw посмотрите... »
Спасибо, добрый человек, выручил, все получилось.
В отличии от моего варианта он выдает ошибку на имена с кодировкой отличной от указанной (-t), т.е. не делает:
Цитата blackmane:
А повторное использование iconv либо оставляет вообще непонятные знаки, либо файлы "исчезают" (они становятся безымянными). »
И также он выдает ошибку на такой вариант:

Но с этим мы быстро справились :-)
Цитата User001:
Еще как вариант ваш код обернуть циклами и менять кодировку начиная с максимальной глубины, но велосипед получился медленный и некрасивый »
Я так и хотел сделать, вот только проблема была в том, что я не мог определить максимальную глубину.

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

Отправлено: 12:13, 22-07-2014 | #3


Аватара для User001

Ветеран


Сообщения: 740
Благодарности: 116

Профиль | Отправить PM | Цитировать


Цитата blackmane:
Я так и хотел сделать, вот только проблема была в том, что я не мог определить максимальную глубину. »
Ну, сначала поискать методом подсчета "/" Вряд ли у вас вложенность больше 10-20...

Отправлено: 12:25, 22-07-2014 | #4



Компьютерный форум OSzone.net » Linux и FreeBSD » Программирование в *nix » [BASh] Рекурсивный обход с переименованием

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Рекурсивный обход папки Ван Рег Скриптовые языки администрирования Windows 7 05-11-2011 01:03
CMD/BAT - [решено] Рекурсивный обход папок с применением команды chdir smit_igor Скриптовые языки администрирования Windows 2 05-06-2011 15:02
VBS/WSH/JS - [решено] Рекурсивный обход папок в WSH на JS petrovre Скриптовые языки администрирования Windows 5 20-02-2011 22:44
CMD/BAT - [решено] Рекурсивный обход Чин Хон Скриптовые языки администрирования Windows 2 22-01-2011 23:12
CMD/BAT - Рекурсивный обход папки Chargos Скриптовые языки администрирования Windows 1 30-12-2010 18:37




 
Переход