URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 48538
[ Назад ]

Исходное сообщение
"перекодировка имени"

Отправлено tenzor , 21-Сен-04 15:59 
Во Фре 4 есть каталог с русским именем, в нем много файлов, тоже с русскими именами, однако из-за всяких недоделок все имена оказались в кодировке win1251, хочу перевести в KOI8-R, то есть неправильно отображаются. Наваял скрипт:

for i in `ls -1wR`;
   do mv "'$i'" `echo "'$i'" | /usr/local/bin/iconv -f CP1251 -t KOI8-R`;
done

То есть каждый файл из вывода команды ls перемещается в новый файл с перекодированным именем.
Все бы хорошо, но имена файлов содержат пробелы, из-за этого получается, что для файла с названием 'фото 1.jpg' появляются две переменные 'фото' и '1.jpg'. Как побороть, не знаю. По идее, надо как-то сообщить, что разделителем служит не пробел, а перевод строки.
У кого какие мысли? Заранее благодарен.


Содержание

Сообщения в этом обсуждении
"перекодировка имени"
Отправлено klalafuda , 21-Сен-04 18:31 
>Во Фре 4 есть каталог с русским именем, в нем много файлов,
>тоже с русскими именами, однако из-за всяких недоделок все имена оказались
>в кодировке win1251, хочу перевести в KOI8-R, то есть неправильно отображаются.
>Наваял скрипт:
>
>for i in `ls -1wR`;
>   do mv "'$i'" `echo "'$i'" | /usr/local/bin/iconv -f CP1251
>-t KOI8-R`;
>done
>
>То есть каждый файл из вывода команды ls перемещается в новый файл
>с перекодированным именем.
>Все бы хорошо, но имена файлов содержат пробелы, из-за этого получается, что
>для файла с названием 'фото 1.jpg' появляются две переменные 'фото' и
>'1.jpg'. Как побороть, не знаю. По идее, надо как-то сообщить, что
>разделителем служит не пробел, а перевод строки.
>У кого какие мысли? Заранее благодарен.

взять `echo "'$i'" | /usr/local/bin/iconv -f CP1251 -t KOI8-R` в двойные кавычки?

// wbr


"перекодировка имени"
Отправлено lavr , 22-Сен-04 10:48 
>>Во Фре 4 есть каталог с русским именем, в нем много файлов,
>>тоже с русскими именами, однако из-за всяких недоделок все имена оказались
>>в кодировке win1251, хочу перевести в KOI8-R, то есть неправильно отображаются.
>>Наваял скрипт:
>>
>>for i in `ls -1wR`;
>>   do mv "'$i'" `echo "'$i'" | /usr/local/bin/iconv -f CP1251
>>-t KOI8-R`;
>>done
>>
>>То есть каждый файл из вывода команды ls перемещается в новый файл
>>с перекодированным именем.
>>Все бы хорошо, но имена файлов содержат пробелы, из-за этого получается, что
>>для файла с названием 'фото 1.jpg' появляются две переменные 'фото' и
>>'1.jpg'. Как побороть, не знаю. По идее, надо как-то сообщить, что
>>разделителем служит не пробел, а перевод строки.
>>У кого какие мысли? Заранее благодарен.
>
>взять `echo "'$i'" | /usr/local/bin/iconv -f CP1251 -t KOI8-R` в двойные кавычки?
>

бред (без обид)

парень получает строковый массив через ls (имена файлов)

допустим у нас файлы: aaa, bbb, ccc
массив будет {aaa bbb ccc}, если в именах файлов пробелы:
aaa, "bb b", "c cc", массив получится НЕ ИЗ ТРЕХ элементов, а:
{ aaa bb b c cc } - так что предложение мягко говоря бестолковое, хоть
мульон кавычек.

подсказка такая, например найти старый пакет kermit'а и взять оттуда и
поправить под себя утилиту конвертации имен файлов и директорий xxu.c
- я так для себя сделал и выложид на свою страницу, к сожалению страница
умерла.

другой вариант, использовать ls -m
например попробуй:

[alone]~/test > ls -la
total 28
drwxr-xr-x   2 lavr  sysct    512 21 сен 18:04 .
drwxr-xr-x  77 lavr  sysct  21504 22 сен 10:31 ..
-rw-r--r--   1 lavr  sysct      0 21 сен 17:40 111 222
-rw-r--r--   1 lavr  sysct      0 21 сен 17:40 333 444 555
-rw-r--r--   1 lavr  sysct      0 21 сен 17:40 666 77 99 00
-rw-r--r--   1 lavr  sysct      0 21 сен 17:40 ashdjfk asdfhjk
-rw-r--r--   1 lavr  sysct     62 21 сен 18:11 la
-rw-r--r--   1 lavr  sysct     49 21 сен 17:34 lala
[alone]~/test > ls -m | tr "," "\n" | sed -e "s/^ //" | tr " " "_"
111_222
333_444_555
666_77_99_00
ashdjfk_asdfhjk
la
lala
[alone]~/test >

вот тебе массив без пробелов, они заменены на "_"
Sorry, коряво и некрасиво, просто сразу навскидку за x-секунд пришло
в голову использование tr (man tr)
Можно sed+awk, самое красивое и гибкое будет наверное на perl'е

>// wbr


"перекодировка имени"
Отправлено Maxim Kuznetsov , 22-Сен-04 11:24 
>Во Фре 4 есть каталог с русским именем, в нем много файлов,
>тоже с русскими именами, однако из-за всяких недоделок все имена оказались
>в кодировке win1251, хочу перевести в KOI8-R, то есть неправильно отображаются.
>Наваял скрипт:
>
>for i in `ls -1wR`;
>   do mv "'$i'" `echo "'$i'" | /usr/local/bin/iconv -f CP1251
>-t KOI8-R`;
>done
>
>То есть каждый файл из вывода команды ls перемещается в новый файл
>с перекодированным именем.
>Все бы хорошо, но имена файлов содержат пробелы, из-за этого получается, что
>для файла с названием 'фото 1.jpg' появляются две переменные 'фото' и
>'1.jpg'. Как побороть, не знаю. По идее, надо как-то сообщить, что
>разделителем служит не пробел, а перевод строки.
>У кого какие мысли? Заранее благодарен.
function reconv {
for i in * ; do
if [ -f $i ] ; then
   $name=`echo $i | iconv -f CP1251 -t KOI8-R`
   mv $i $name
elif [ -d $i ] ; then
   cd $i
   reconv
   cd ..
fi
done
}
кстати переименовывать их лучше в другой каталог, а потом уже результат переносить на место, потому-что если например будут два файла - один "бНОПНЯ.txt" а второй "вопрос.txt" то выживет только один


"перекодировка имени"
Отправлено newser , 22-Сен-04 12:13 
>function reconv {
>for i in * ; do
> if [ -f $i ] ; then
>   $name=`echo $i | iconv -f CP1251 -t KOI8-R`
>   mv $i $name
> elif [ -d $i ] ; then
>   cd $i
>   reconv
>   cd ..
> fi
>done
>}

Строку
  mv $i $name
лучше записать так:
  mv "$i" "$name"
иначе опять возникнут проблемы с пробелами.