Re: Кодировка имен файлов в КДЕ на CD/DVD, FLOPPY, FLASH |
Заголовок темы: Re: Кодировка имен файлов в КДЕ на CD/DVD, FLOPPY, FLASH Отправитель: SwitNJ 15/12/2008 15:59:28 Итак.. окончательный результат. Вроде бы все работает. Проверялось на флешках, на оптических носителях (на дискетах к сожалению не успел (но проверял до этого в 11.0 - работало), так как с установкой опенсусе 11.1 из системы напрочь пропал /dev/fd0 - об этом глюке отдельно поговорить надо). Итак.. по порядочку. Во-первых - огромный респект товарищу AX (linux.org.ru), который помогал мне доводить до ума скрипт (http://www.linux.org.ru/view-message. ... ocache=-560865565#3314885) Во вторых, спасибо тем кто откликнулся в помощи по работе с симлинками и с регэкспами (http://www.linux.org.ru/view-message. ... ocache=1594829517#3307630) (http://www.linux.org.ru/view-message. ... ocache=-707814850#3305032). Очень познавательно вышло. А теперь по сути. А) идем в папку /bin и переименовываем /bin/mount в /bin/mount_true Б)создаем сам скрипт /bin/mount (права выставить в root:root , rwx r-x r-x) #!/bin/bash # Change Additional mount options with IOCHARSET and CODEPAGE you need # Additional mounting options (cyrillic correction) default_additional_options=",iocharset=cp1251,codepage=1251" additional_options_cdrom=",iocharset=cp1251" log_name="/var/log/mount.log" echo "Sended to mount:" | tee -a "$log_name" echo $* | tee -a "$log_name" echo $* | iconv -f UTF-8 -t cp1251 | tee -a "$log_name" # Get mount point name mount_point=`expr "$*" : '.*\(/media/[^ \t\n]*\)'` # Get try mount point name try_mount_point=`echo $mount_point | iconv -f UTF-8 -t cp1251` # Create symlink in /media/ directory if [ ! "$try_mount_point" == "$mount_point" ] && [ ! -e "$try_mount_point" ];then ln -s "$mount_point" "$try_mount_point" fi # Removing [,]utf8[=true][,] parameters=`echo $* | sed -r s/"(,utf8(=true)?|utf8(=true)?,)"//` echo "Removing UTF8:" | tee -a "$log_name" echo $parameters | tee -a "$log_name" # Checking if FS type or Mounting Options specified if ( expr "$parameters" : '.*\(/dev/\(sr\|cdrom\):alnum:*\)' > /dev/null ); then # update mount options for cdrom parameters=`echo $parameters | sed -r s/"-o [[:alnum:],-_=]*"/\&$additional_options_cdrom/` elif ( expr "$parameters" : '.*\(/dev/\(fd\|floppy\):alnum:*\)' > /dev/null ) || ( expr "$parameters" : '.*\(-t vfat:blank:\)' > /dev/null ); then # update mount options for other parameters=`echo $parameters | sed -r s/"-o [[:alnum:],-_=]*"/\&$default_additional_options/` fi echo "Corrected for CD/DVD/USB(vfat)/FLOPPY:" | tee -a "$log_name" echo $parameters | tee -a "$log_name" # mount /bin/mount_true $parameters Как это работает? 1) скрипт перехватывает параметры, передаваемые в mount 2) выделяется имя точки монтирования. если она на utf8 (то есть отображается крокозябрами) то имя приводится к нормальному, путем создания символической ссылки в виде правильного имени на корявое. если такая ссылка уже есть или название ссылки английское - оставляем как есть. ЭТО ВАЖНО, так как оптические диски с метками на русском языке просто напросто не будут монтироваться вообще. 3) из параметров монтирования удаляется опция (,)utf8(=true). если ее оставить то никакие iocharset не помогут. 4) если это оптический диск (cd/dvd) то добавляем опции ",iocharset=cp1251" 5) если это диск с vfat или же это флоппик - добавляем в опции ",iocharset=cp1251,codepage=1251" 6) производим монтирование с поправленными опциями. Побочный эффект: 1) на экран попадает отладочная информаци (можете сами закоментировать строки с echo ... | tee -a ... 2) после переустановки системы или обновления системы монтирования (что редко оооочень) нужно положить скрипт куда следует заново - смотри пункт А) 3) создаются симлинки в кириллице на автоматические точки монтирования с неправильной кодировкой. По извлечении диска симлинки становятся мертвыми. Решение: 3.1) создаем файлик /bin/delsymlinks с правами на выполнение для всех. #!/bin/bash for link in $(find /media -type l); do test -e $link || rm $link ; done 3.2) идем в /etc/crontab и добавляем туда строку */1 * * * * root /bin/delsymlinks 3.3) выполняем от пользователя root перезагрузку шедулера: service cron restart (по крайней мере в 11.1 оно так) Все! После этого каждую минуту запускаемый скрипт проверяет папку /media/ на наличие мертвых симлинков и в случае обнаружения - удаляет их. И более НИЧЕГО не нужно шаманить ни в каких fstab, hal и прочих, потому как первое неудобно а второе вообще никак толком не работает. Что касается версий окружения - будет работать везде, независимо от версии КДЕ, может даже и под ГНОМОМ, а какая ему разница? Скажу только что в КДЕ 4.1 более недоступна функция просмотра опций монтирования для устройств, как было в 3.5.. там хоть можно было снять "монтировать в утф8". А! и еще.. если что-то от руки не получается примонтировать по команде mount - выполяйте с консоли команду mount_true заместо mount. |