LINUX.ORG.RU
ФорумAdmin

grep file > file = null


0

0

Обясните почему это происходит и как от этого избавится.

Например мне нужно выполнить iconv -f CP1251 -t UTF-8 file.txt > file.txt но в таком случае файл оказывается пуст. Тоже самое происходит с cut, grep etc.

патамушта в тот же файл нельзя перенаправлять. В другой надо.

sidor ★★
()
Ответ на: комментарий от Tok

Насамом деле задача такая) Нужно найти все файлы и перекодировать их.

Ну что-то типо:

find /home/ldap -name *ldif -exec iconv -f CP1251 -t UTF-8 {} \;

Но в моем примере она просто все вывидит на терминал. А как можно сделать так чтобы она сохранила все подсунутые фалы с теме же именами но перекодировав их?

tux-tools
() автор топика
Ответ на: комментарий от tux-tools

А как можно сделать так чтобы она сохранила все подсунутые фалы с теме же именами но перекодировав их?

find /home/ldap -name *ldif -exec enconv {} \;

:)

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

find /export/home/ldap/*ldif -exec iconv -f CP1251 -t UTF-8 {} \;

Это сделает вывод на терминал. В соляре параметра -о нет, тоесть нельзя сделать:

find /export/home/ldap/*ldif -exec iconv -f CP1251 -t UTF-8 {} -o {} \;

И незнаю работало бы это или нет.

Какие еще предложения?

tux-tools
() автор топика
Ответ на: комментарий от tux-tools

Какие еще предложения?

Повторяю еще раз: выкинуть нафиг устаревший iconv и пользоваться enconv'ом!!!

А два раза {} в find использовать нельзя, в этом случае надо xargs подключать.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Понял, спасибо попробую.

А мог бы ты обяснить как быть например при

grep test {} > {}

В этом случае файл будет пуст. Можно ли это как-то обойти используюя xargs?

tux-tools
() автор топика
Ответ на: комментарий от tux-tools

Напишите простейшый скрипт-обертку, что то типа

#!/bin/bash iconv -f CP1251 -t UTF-8 $i > /tmp/tmpfile && mv /tmp/tmpfile $i

Дайте файлу с этим скриптом права на исполнение и вызывайте его из find и т.д. Все равно все команды, меняющие содержимое файла создают временный файл.

mky ★★★★★
()
Ответ на: комментарий от tux-tools
grep "tralala" trololo > trololo.tmp; mv -f trololo.tmp trololo

По-другому нельзя: вывод grep'а bash будет пытаться писать в открытый на чтение grep'ом файл, и ничего хорошего из этого не выйдет.

Eddy_Em ☆☆☆☆☆
()

> iconv -f CP1251 -t UTF-8 file.txt > file.txt но в таком случае файл оказывается пуст.

Перенаправление в файл (> file.txt) отрабатывается шелом _ДО_ запуска команды. > file.txt означает создать пустой файл и перенаправить в него stdout. Так как файл file.txt не пустой он обнуляется и команда iconv уже запускается с пустым входным файлом.

sdio ★★★★★
()
Ответ на: комментарий от tux-tools

Даже если бы файл не обнулялся при старте конвеера (символ >), и процесс , грубо говоря, писал бы в начало файла, а читал из середины, то в вашем случае (кодирование из однобайтной кодировки в UTF-8) результирующий файл должен получаться больше, и в принципе невозможно записывать результат в читаемый файл.

mky ★★★★★
()
Ответ на: комментарий от tux-tools

Есть такая прога.

>Понял, думал есть какая-то прога которая решает это при работе в конвейре

Есть такая программа, называется sponge, входит в пакет moreutils. К сожалению весьма глючная. У меня из-за неё post-commit hook в SVN рассылал уведомления через раз, хотя входные параметры были одинаковые. То есть sponge на одних и тех же данных то работала, то не работала (случайным образом).

Так что выбора нет, создавай временные файлы.

Camel ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.