[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [shell-script] Copiar arquivo para as pastas
From: |
Felipe Kellermann |
Subject: |
Re: [shell-script] Copiar arquivo para as pastas |
Date: |
Wed, 14 Apr 2004 16:47:07 -0300 (BRT) |
On Wed, 14 Apr 2004 2:15pm -0300, Julio Cezar Neves - DATAPREVRJ wrote:
> mindepth pq não tinha certeza se seria - mindepth 1 ou -mindepth 0 e como
> estava escrevendo a linha direto no e-mail sem testar bateu uma prequiça de
> ir ao man...
É... é uma questão de estruturas :-)
Mas aqui vão algumas dicas interessantes sobre o assunto...
> Veja esta observação tirada de Unix Power Tools, first edition (O'Reilly &
> Associates):
>
> The modern UNIX OS seems to have solved the problem of the find command
> overflowing the command-line buffer. However, using the find -exec command
> is still troublesome. It's better to do this:
> # remove all files with a txt extension
> find . -type f -name "*.txt" -print|xargs rm
> than this:
> find . -type f -name "*.txt" -exec rm {} \; -print
>
> Por outro lado eu fiz um teste de performance com um grep recursivo, e com o
> xargs foi muuuiiiito mais rápido que com o exec. Experimente vc mesmo:
Eu tenho a segunda edição do UPT. Acho uma boa referência, mas devo te
admitir que eu interpretaria a sugestão deles de maneira diferente. Mas
de qualquer forma, apesar de eu não ter certeza se eles comentam isso no
livro: Esse caso não tem nada a ver com o caso que estávamos vendo.
E qual é a diferença? Enorme. Eles não estão fazendo substituições.
A minha explicação está logo abaixo do teu exemplo, aqui:
> find / -type f -exec grep -l "cadeia" {} \;
> find / -type f | xarg grep -l "cadeia"
Sim, esse caso, sim. Vai ser melhor. Não tenho nenhuma dúvida.
É para isso que o `xargs' serve, originalmente... Outra questão :-)
Mas tu tá te esquecendo de uma característica: A opção `i' vai, com
razão, implicar no processamento por linhas normal, novamente. Aqui:
$ echo "fuu\nbar" | xargs echo
fuu bar
$ echo "fuu\nbar" | xargs -i echo {}
fuu
bar
Daqui, concluímos que é até muito pior usar o xargs nesses casos.
Além de não fazer aquilo que ele é usualmente usado para fazer, vai estar
sendo um processamento morto e nós vamos estar gastando recursos à toa.
Tu conseguiria resolver isso e tornar ele novamente "útil"? Sim, e de
diferentes formas, incluindo uma estranhamente interessante e outras mais
lógicas (do primeiro caso, AFAIK -- li quando era guri, há comentários no
UPT, pelo menos). Mas isso vai ficar de exercício ao leitor :-)
(sidenote)
PS: Queria dizer também que _nenhuma_ dessas alternativas seria a minha
opção ideal. Costumo manter o assunto porque é assim que as coisas eram
feitas, mas não é assim que as coisas precisam ser feitas.
> | $ cp arq /home/*
>
> Esta é a saída mais óbvia, mais otimizada e mais tudo. Fico danado qdo não
> vejo o óbvio...;(
Mas ela ainda tem o problema do possível limite ARG_MAX que aqui entraria
o xargs mas sem o caso da substituição. Resolvendo, portanto, o problema
de forma completa. Na minha opinião.
> Valeu Felipe, pelo menos deixamos na lista uma discussão produtiva.
> Vc respondeu ao Aurélio o convite que ele nos fez para sermos juízes de um
> concurso? Eu aceitei.
Respondi.
Até mais,
--
Felipe Kellermann