[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