перекодировка имен файлов.

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Ответить
Slimy
Сообщения: 1689
ОС: openSuSE 11.2 GM (GеMор едишн)

перекодировка имен файлов.

Сообщение Slimy »

В общем есть каталог с файлами где побитая кодировка есть строка на bash которая дает верный вывод в ls а как ее применить для всех файлов.
Чего то не выходит у меня пробовал так. Еще похоже что обход должен быть рекурсивным очевидно надо чтото в "." поменять темболее что это не сработало.

Код: Выделить всё

for i in .  ; do mv "$i" |  iconv -f utf-8 -t cp1252 | iconv -f cp1251 -t utf8 ${i}; done
Если уже ничего не помогает - прочти инструкцию.
sysinstall - гадость :)
ASUS A6q00Vm Pentium-M 1.7 GHz, 2Gb RAM, 160Gb HDD,
GeForce Go 7300 64Mb video
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5289
ОС: Gentoo

Re: перекодировка имен файлов.

Сообщение /dev/random »

Slimy писал(а):
04.08.2012 16:37
В общем есть каталог с файлами где побитая кодировка есть строка на bash которая дает верный вывод в ls а как ее применить для всех файлов.
Чего то не выходит у меня пробовал так. Еще похоже что обход должен быть рекурсивным очевидно надо чтото в "." поменять темболее что это не сработало.

Код: Выделить всё

for i in .  ; do mv "$i" |  iconv -f utf-8 -t cp1252 | iconv -f cp1251 -t utf8 ${i}; done

Вообще-то, для этого есть утилита convmv.

Но если вы хотите, из образовательного интереса, выловить все ошибки в вашей строчке...

1) В команде for следует указывать не каталог, а шаблон.

2) Оператор | берёт стандартный вывод (stdout) команды, указанной слева, и передаёт его на стандартный ввод (stdin) команде, указанной справа. Очевидно, что ваша mv "$i" не выдаст на stdout ничего, а лишь ругнётся в stderr, что вы указали только один файл вместо двух. Если вы хотите сформировать и подставить параметр, то это делается с помощью "$( команда, выводящая параметр на stdout )"

3) iconv конвертирует _содержимое_ файла, если он указан, или stdin в противном случае, и выводит его на stdout. Т.е. ваш последний iconv сконвертирует _содержимое_ файла, имя которого содержится в ${i}, и выведет его вам в терминал. При этом переданный ему через | вывод команд слева он проигнорирует. Если вы хотите сконвертировать содержимое переменной, передайте его через echo.

4) Для рекурсивного конвертирования воспользуйтесь find или shopt -s globstar
Спасибо сказали:
Slimy
Сообщения: 1689
ОС: openSuSE 11.2 GM (GеMор едишн)

Re: перекодировка имен файлов.

Сообщение Slimy »

Да я именно из образовательных побуждений. Главное ту какраз в этот поток данные направить и их от туда извлеть направить туда просто echo а вот как снять их в значение для mv не понятно.
Если уже ничего не помогает - прочти инструкцию.
sysinstall - гадость :)
ASUS A6q00Vm Pentium-M 1.7 GHz, 2Gb RAM, 160Gb HDD,
GeForce Go 7300 64Mb video
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: перекодировка имен файлов.

Сообщение Bizdelnick »

Slimy писал(а):
05.08.2012 16:31
как снять их в значение для mv не понятно

man xargs
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5289
ОС: Gentoo

Re: перекодировка имен файлов.

Сообщение /dev/random »

Slimy писал(а):
05.08.2012 16:31
вот как снять их в значение для mv не понятно.

См. конец пункта 2 в моём посте.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: перекодировка имен файлов.

Сообщение drBatty »

Slimy писал(а):
05.08.2012 16:31
Главное ту какраз в этот поток данные направить и их от туда извлеть направить туда просто echo а вот как снять их в значение для mv не понятно.

есть много способов, например

Код: Выделить всё

find |\
while read file_name
do
 echo "$file_name"
done

вместо echo "$file_name" можно написать что-то другое. К примеру

Код: Выделить всё

new_file_name=$(echo "$file_name"|iconv)
mv "$file_name" "$new_file_name"
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Ответить