Você pode encadear chamadas para descobrir (uma vez, quando soube, que é possível, o que pode ser hoje). Obviamente, isso só é possível enquanto você permanecer em busca. Depois de canalizar para xargs, fica fora de escopo.
Pequeno exemplo, dois arquivos a.lst e b.lst:
cat a.lst
fuddel.sh
fiddel.sh
cat b.lst
fuddel.sh
Não há truque aqui - simplesmente o fato de que ambos contêm "fuddel", mas apenas um contém "fiddel".
Suponha que não sabíamos disso. Pesquisamos um arquivo que corresponde a 2 condições:
find -exec grep -q fuddel {} ";" -exec grep -q fiddel {} ";" -ls
192097 4 -rw-r--r-- 1 stefan stefan 20 Jun 27 17:05 ./a.lst
Bem, talvez você conheça a sintaxe do grep ou de outro programa para passar as duas strings como condição, mas esse não é o ponto. Todo programa que pode retornar verdadeiro ou falso, dado um arquivo como argumento, pode ser usado aqui - grep era apenas um exemplo popular.
E observe que você pode seguir find -exec com outros comandos find, como -ls ou -delete ou algo semelhante. Observe que essa exclusão não apenas remove o rm (remove arquivos), mas também remove o rmdir (remove os diretórios).
Essa cadeia é lida como uma combinação de comandos AND, desde que não seja especificado de outra forma (ou seja, com um -or
switch (e parens (que precisam ser mascarados))).
Portanto, você não está saindo da cadeia de busca, o que é útil. Não vejo nenhuma vantagem em usar -xargs, pois você deve ter cuidado ao passar os arquivos, o que é algo que a descoberta não precisa fazer - ele lida automaticamente com a passagem de cada arquivo como um argumento único para você.
Se você acredita que precisa de alguma máscara para encontrar aparelhos {} , sinta-se à vontade para visitar minha pergunta, que pede evidências. Minha afirmação é: você não.
find
. Muito obrigado!-exec
agirxargs -P4
para que três dos quatro núcleos não fiquem ociosos?O encaminhamento seguro de nomes de arquivos
xargs
requer que vocêfind
suporte a-print0
opção exargs
tenha a opção correspondente para lê-la (--null
ou-0
). Caso contrário, os nomes de arquivos com caracteres não imprimíveis ou barras invertidas ou aspas ou espaço em branco no nome podem causar um comportamento inesperado. Por outro lado,find -exec {} +
está na especificação POSIXfind
, por isso é portátil e é tão seguro quantofind -print0 | xargs -0
e definitivamente mais seguro quefind | xargs
. Eu recomendo nunca ficarfind | xargs
sem-print0
.fonte
find … -exec … {} +
é o OpenBSD, que só adquiriu esse recurso com a versão 5.1 lançada em 2012. Todos os BSDs possuem-print0
há vários anos, mesmo o OpenBSD (apesar de resistir a esse recurso por um tempo também). O Solaris, por outro lado, adere aos recursos do POSIX, para que você obtenha-exec +
e não-print0
.-print0
é uma dor e, embora você possa argumentar quexargs --delimiter "\n"
não é equivalente, nunca usei o primeiro depois de descobrir o último.-0
é mais doloroso do que isso--delimiter "\n"
.-0
, o GNUxargs
precisa-r
evitar executar o comando se não houver entrada.| xargs -r0 cmd
é quecmd
o stdin é afetado (dependendo daxargs
implementação, é/dev/null
ou da tubulação.Se você usar o
-exec ... ;
formulário (lembrando-se de escapar do ponto-e-vírgula), estará executando o comando uma vez por nome de arquivo. Se você usar-print0 | xargs -0
, execute vários comandos por nome de arquivo. Você definitivamente deve usar o-exec +
formulário, que coloca vários arquivos em uma única linha de comando e é muito mais rápido quando um grande número de arquivos está envolvido.Uma grande vantagem do uso
xargs
é a capacidade de executar vários comandos em paraleloxargs -P
. Em sistemas com vários núcleos, isso pode proporcionar uma enorme economia de tempo.fonte
-P
vez de-p
. Lembre-xargs -P
se de que não está no padrão POSIXfind -exec {} +
, o que é importante se você está buscando portabilidade.find /tmp/ -exec ls "{}" +
funciona muito bem.-exec
de tanto tempo (sou masoquista, nem uso aspas para escapar{}
, sempre digito\{\}
; não pergunto); tudo parece que deve ser escapado agora.find /tmp/ -exec ls {} +
que não funcionaria.bash
comecei a aceitar o aparelho literalmente. Tenho certeza de que pelo menos uma das conchas antigas que usei fazia ataques sibilantes se o aparelho não escapasse.Em relação ao desempenho, pensei que isso
-exec … +
seria simplesmente melhor porque é uma ferramenta única que faz todo o trabalho, mas uma parte da documentação do GNU findutil diz que-exec … +
pode ser menos eficiente em alguns casos:Eu não tinha muita certeza do que isso significava, então perguntei no bate-papo onde derobert explicou como:
(Formatação feita por mim.)
Então tem isso. Mas se o desempenho realmente importa, você teria que fazer comparações realistas ou melhor, perguntar-se se você gostaria de usar o shell para esses casos.
Aqui neste site, acho melhor aconselhar as pessoas a usarem o
-exec … +
formulário sempre que possível, porque apenas porque é mais simples e pelos motivos mencionados nas outras respostas aqui (por exemplo, lidar com nomes de arquivos estranhos sem ter que pensar muito).fonte