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