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