В сообщении от 1104436870 секунд после начала Эпохи Unix Вы написали:
> Но всплыла другая проблема
> Когда каталог или файлы с названием на русском копируется ко мне они
> имеют примерно такой вид ____.doc
Это не удивительно, другие приложения думают что название файла в
кодировке UTF-8, а gftp записал его в кодировке CP1251. После
копирования файлов и каталогов нужно перекодировать их имена в кодировку
UTF-8.
Так как эта проблема часто возникает у жителей нашей многострадальной
страны (и стан СНГ), я написал скрипт для перекодировки имен файлов
(хотя, лучше бы сделал "нормальный" ftp-клиент ;-) ).
начало recode-rename #!/bin/sh
force=""
recursive=""
while true; do
case "$1" in
-f) force="-f";;
-r) recursive="-r";;
*) break;;
esac
shift
done
fromto="$1"
shift
if [ "$fromto" = "" -o $# = 0 ]; then
echo "Usage: recode-rename [-f] [-r]" \
"FROMCARSET..TOCHARSET dir|file..."
echo "Recode file name(s) from FROMCARSET to TOCHARSET."
echo "Options:"
echo " -f force recoding/renaming"
echo " -r process directories recursively"
exit 1
fi
recode=`which recode 2>/dev/null`
if [ $? != 0 -o ! -x $recode ]; then
echo "Could not find recode command"
exit 1
fi
rename_file() {
oldname="$1"
newdir=`dirname "$1"`
newbase=`basename "$1" |$recode $force "$fromto"`
[ $? = 0 ] || return 1
newname="$newdir/$newbase"
[ "$oldname" != "$newname" ] &&
mv $force "$oldname" "$newname"
}
while [ "$1" != "" ]; do
if [ "$recursive" != "" -a -d "$1" ]; then
find "$1" -depth |
( while read n; do rename_file "$n"; done )
else
rename_file "$1"
fi
shift
done
exit 0
конец recode-rename Запишите этот файл куда нибудь, например в `/usr/local/bin', и дайте
права на выполнение. В вашем случаи есть один неприятный нюанс Вы не
сможете из терминала ввести имя для перекодировки, если оно в CP1251, а
терминал настроен на UTF-8. Я вижу такие решения:
а) прописать вызов скрипта в меню mc или другого файлового менеджера;
б) использовать "Открыть в...", "Отправить в...", и т.п. команды
файлового менеджера;
в) настроить терминал на 8-битовую кодировку, и из него выполнить
команду;
г) разместить файл(ы), которые нужно перекодировать, в каталог с
нормальным ASCII именем (в котором присутствуют только знаки и
буквы латинского алфавита), после чего выполнить:
$ recode-rename -r CP1251..UTF-8 ascii-directory
> А также я заметил еще одну странную вещь (я не знаю связано ли это с
> моей проблемой)
> gftp почемуто отказывается копировать файлы,названия которых
> написаны на русском, на диск fat (где у меня находиться windows) -
> хотя из linuxa я свободно копирую туда файлы с названиями на русском
Это объясняется тем что Windows использует кодировку CP866 для хранения
имен файлов в FAT. Соответственно Linux (при наличии необходимых опций
монтирования) перекодирует имена файлов из кодировки вашей локали в
CP866 при создании/переименовании файлов в разделе с FAT. А так как
имена файлов, которые создает gftp не в UTF-8 (как думает модуль fat), а
в CP1251, то такое перекодирование для имени файла оказывается
фатальным.