[Rio-pm] In place editing recursivo

Alexei Znamensky russoz em gmail.com
Terça Junho 9 02:58:38 PDT 2009


Breno, Donato,

Se a quantidade de arquivos na árvore for muito grande e/ou o nome deles for
muito comprido, eventualmente você pode estourar o buffer da linha de
comando (8k no Linux, se a memória não falha) no resultado do find. O jeito
mais garantido de fazer isso é:

perl -MFile::Find -le 'find({wanted => sub{print if /\.fdf$/i}, no_chdir =>
1 },q{.})' | xargs perl -i.bak -pe 's/CA/CB/g'

De xargs(1):

DESCRIPTION
       This manual page documents the GNU version of xargs.  xargs reads
items
       from  the  standard  input, delimited by blanks (which can be
protected
       with double or single quotes or a backslash) or newlines, and
executes
       the  command (default is /bin/echo) one or more times with any
initial-
       arguments followed by items read from standard input.  Blank  lines
on
       the standard input are ignored.

De novo, não tenho idéia de como fazer isso no Janelows. Quando sou obrigado
a entrar naquilo, eu geralmente uso Cygwin para tornar a existência
minimamente suportável.

[]s,
Russo

2009/6/9 breno <breno em rio.pm.org>

> 2009/6/8 Donato Azevedo <donatoaz em gmail.com>:
> >>>
> >>> perl -MFile::Find "find( sub { print if /\.fdf$/i }, '.' )" | perl
> >>> -pi.bak -e "s/CA/CB/g"
> >>>
> >>> alguem sabe o que ta errado, ou mesmo se é possível fazer algo estilo
> >>> golf pra isso?
> >>
>
> Bom, vejo três problemas aí. O primeiro é que as respostas são dadas
> com print puro então vem sem espaço ou quebra de linha. Isso é
> facilmente resolvido com o -l. Já o segundo é q o find simples vai
> retornar apenas o nome do arquivo, o que impossibilita encontrá-lo
> pelo outro script. Para obter o caminho junto com o arquivo (e pulando
> linha), vc precisa substituir a primeira parte por algo como:
>
> perl -MFile::Find -le 'find({wanted => sub{print if /\.fdf$/i},
> no_chdir => 1 },q{.})'
>
> O terceiro problema é que, ao alimentar por pipe um one-liner que faz
> -p, é como se vc quisesse modificar esse conteúdo, e não passar
> arquivos que deveriam ser abertos e ter o conteúdo modificado (que
> acredito ser o q vc quer), como ocorre qdo passamos a lista de
> arquivos no final.
>
> A solução mais óbvia que encontrei foi inverter a ordem dos oneliners
> e usando a sintaxe shell de crase `` para indicar "pegue a saida disso
> e passe para o primeiro comando". Ficou assim:
>
>  perl -i.bak -pe 's/CA/CB/g' `perl -MFile::Find -le 'find({wanted =>
> sub{print if /\.fdf$/i}, no_chdir => 1 },q{.})'`
>
> Mas não tenho idéia de como fazer isso em win32...
>
>
> []s
>
> -b
> _______________________________________________
> Rio-pm mailing list
> Rio-pm em pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm
>



-- 
Alexei Znamensky [russoz_gmail_com] [russoz.wordpress.com] [
www.flickr.com/photos/alexeiz]
"Though we live in trying times, we're the ones who have to try"
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/rio-pm/attachments/20090609/72d757f2/attachment.html>


Mais detalhes sobre a lista de discussão Rio-pm