LINUX.ORG.RU

find, простенький скрипт


0

0

есть несколько папак, в них > 20 файлов в cp1251
хочу перевести все в utf8
не знаю как указать iconv что бы он вывод делал не на экран
а в тот же файл откуда и ввод,
точнее знаю -o '{}', но сталкиваюсь с проблеммой
# find . -type f -exec "iconv -f cp1251 -t utf8 '{}' -o '{}' " \;
iconv: cannot open output file: Permission denied

(права на запись есть)


какие есть варианты решения ?


поставить easytag ! делается в нём за пару секунд

anonymous
()

ой, не то:)

anonymous
()

Так нельзя. перенаправляй вывод вовременный файл, а его потом переименуй как тебе нужно.

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

не верю
уверен что как-то можно ))
просто файлов много и мне не сильно хочеться их потом переименовывать
как вариатн придумал спрева сделать find + touch
# find . -type f -exec "touch 'utf_{}'" \;

а потом
# find . -type f -exec "iconv -f cp1251 -t utf8 '{}' -o 'utf_{}' " \;

можно кто сможет преложить лучший способ ? =)

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

с touch не катит
т.к.
[blackICE] IT-inside > find . -type f -exec touch 'utf_{}' \;
touch: cannot touch `utf_./templates/bottom.tpl': No such file or directory

т.е. нужно анализировать путь наличие в нем папок, что не сильно приятно (

будут еще предложения ?

hose
() автор топика

find . -type f -printf "mv %p /tmp/x.tmp;iconv -f cp1251 -t utf8 /tmp/x.tmp -o %p;rm /tmp/x.tmp;"|sh

anonymous
()
Ответ на: комментарий от hose

> не верю

Очень жаль. Толстолобость - большой недостаток :(

anonymous
()

for i in * ;do touch out/$i ; done && for i in * ; do iconv $i -fKOI8-R -tWINDOWS-1251 > out/$i; done

Я так для своего LBook'а файло конверчу.

З.Ы. [cenzured] разработчики - где GPL?

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

>> не верю

>Очень жаль. Толстолобость - большой недостаток :(

ты знаешь я с ттобой согласен =)

to marsijanin - давай твой скрипт доработаем что бы он для вложенных
папок тоже работал =)

hose
() автор топика

Что-то вроде:

# find . -type f -exec "recode cp1251..utf8 '{}'" \;

the_one
()
Ответ на: комментарий от anonymous

>>папак 

>К патанатому, быдло!

это все что ты можешь написать, верно ? =)

2the_one  спасибо, но я уже таки свой скипрт на пхп своял

могу поделиться, правда он у меня немного грамозкий получился 



[blackICE] icovn > cat iconv.php
<?
   require 'xdir.class.php'; // cм ниже
   $mydir = '../test';  // указываешь с какой дирикротии брать файлы
   $from = 'cp1251 ';   // ну эти две строчки я думаю ясны =)
   $to = 'utf8 ';
   $exts_mask = array('php', 'tpl'); // указываешь для файлов с каким расширением выполнять конвертирование

   $dir = new xDir($mydir, true); 
   while( false !== ($entry = $dir->read())) {
      $exts = explode('.', $entry); // может кто подскажеть более просто путь узнать расширение ? 
      $exts = end($exts);
      if(array_search($exts, $exts_mask) !== false)
      {
         // к сожелению кросплатформеность не поддеживаеться :)
         echo 'changing: '.$entry;
         // ну тут все просто как 2х2 =)
         system('touch '.$entry.'_tmp');
         $iconv = 'iconv -f'.$from.' -t'.$to.' '.$entry.' -o'.$entry.'_tmp';
         system($iconv);
         system('mv '.$entry.'_tmp '.$entry);
         echo '... done', "\n";
      }
   }

   $dir ->close();
?>

[blackICE] icovn >                            


[blackICE] icovn > cat xdir.class.php
<?php
  class xdir {
      private $path;
      private $entries = array();
      private $counter = 0;
      private $isRecursive;


      public function __construct($path, $recursice = false)
      {
          if((substr($path, strlen($path) - 1, 1) == '/') && strlen($path) != 1)
            $path = substr($path, strlen($path)) -1;

          $this->path = $path;
          $this->isRecursive = $recursice;

          if($this->path)
            $this->_GetDirList($this->path);
      }

      public function read()
      {
          if($this->counter <= (sizeof($this->entries) - 1 ))
          {
            $s = ($this->entries[$this->counter]);
            $this->counter++;
            return $s;
          }
          else
            return false;

      }

      public function isRecursive()
      {
          return $this->isRecursive;
      }

      public function rewind()
      {
          $this->counter = 0;
          return true;
      }

      public function close()
      {
          return true;
      }

      public function _GetDirList($dirName)
      {
          $objDir = dir($dirName);

          if( $objDir)
          {
              while($strEntity = $objDir->read())
              {
                  if( $strEntity != '.' && $strEntity != '..')
                  {
                      if( (!is_dir($dirName . '/' .$strEntity)) )
                        array_push($this->entries,$dirName."/".$strEntity);
                      else {
                         if($this->isRecursive)
                            $this->_GetDirList($dirName."/".$strEntity, true);
                      }
                  }
              }

              $objDir -> close();
          }

      }

      public function GetFiles()
      {
          if($this->files)
            return $this->files;

      }

      public function GetDirs()
      {
          if($this->dirs)
             return $this->dirs;
      }
  }

?>

hose
() автор топика
Ответ на: комментарий от anonymous

Кстати! anonymous (*) (22.01.2008 23:19:31) предложил тебе работающее решение, но ты из-за своей ламерской упертости в упор его не видишь :)))

anonymous
()

enconv умеет перекодировать без всяких временных файлов

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

теперь прочит что ты написал anonymous (*) (22.01.2008 22:46:15), и след свой пост и пост anonymous (*) (22.01.2008 23:19:31)
а теперь ответь кто из нас лемер ?


а анонимуса действительно не заметир
respect ему
буду иметь ввиду

hose
() автор топика
Ответ на: комментарий от anonymous

> :) То что делается в несколько строчек ты умудрился растянуть на два экрана! Браво.

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

слушай не парь себе и другим мозги - иди кури траву, и не борзей =)

hose
() автор топика

find . -type f | while read i; do
mv -f "$i" "$i.orig" &&\
iconv -f cp1251 -t utf8 <"$i.orig" >"$i" &&\
rm -f "$i.orig"
done

строчка не одна, зато читабельно...

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

hose, не позорься. По твоему /tmp/x.tmp - это не промежуточный файл? Ты и в самом деле упертый ламер :)))

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

оО
а по твоему это что-то иное ?

зы завязывай с травой - она плохая =)

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