blackmane
18-07-2014, 17:58
Доброго дня!
Обратился пользователь с проблемой, в сетевой папке у большинства файлов с кириллическим названием слетела кодировка.
https://lh5.googleusercontent.com/-uTFQLcg-A78/U8kkwmVz_tI/AAAAAAAABIc/B-CrB2U5K0g/w706-h132-no/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA.PNG
Сами файлы не повреждены, только имена.
Сетевой ресурс находится на машинке с 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;
Переименование только второго уровня, изначально мне казалось что он сработает только на последний уровень.
Вся проблема в том, что при переборе переименовывается родительская папка, следовательно дочерние не доступны.
https://lh6.googleusercontent.com/-dyZEVvxOlBs/U8knRv3uTVI/AAAAAAAABIs/m6zHbw4CJUk/w500-h361-no/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA.PNG
А повторное использование iconv либо оставляет вообще непонятные знаки, либо файлы "исчезают" (они становятся безымянными).
Может у кого нибудь был такой опыт?
Обратился пользователь с проблемой, в сетевой папке у большинства файлов с кириллическим названием слетела кодировка.
https://lh5.googleusercontent.com/-uTFQLcg-A78/U8kkwmVz_tI/AAAAAAAABIc/B-CrB2U5K0g/w706-h132-no/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA.PNG
Сами файлы не повреждены, только имена.
Сетевой ресурс находится на машинке с 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;
Переименование только второго уровня, изначально мне казалось что он сработает только на последний уровень.
Вся проблема в том, что при переборе переименовывается родительская папка, следовательно дочерние не доступны.
https://lh6.googleusercontent.com/-dyZEVvxOlBs/U8knRv3uTVI/AAAAAAAABIs/m6zHbw4CJUk/w500-h361-no/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA.PNG
А повторное использование iconv либо оставляет вообще непонятные знаки, либо файлы "исчезают" (они становятся безымянными).
Может у кого нибудь был такой опыт?