A julgar poro log de alterações do GNU findutilsele deveria estar na descoberta do GNU por pelo menos uma década (também mais do que fazia parte do POSIX), então pode-se presumir com segurança que ele é suportado em todos os lugares agora?
Além disso, há boas razões para defendê-lo xargs
nos casos em que -exec … +
poderia ser usado? (Obviamente, você usaria xargs
se precisasse de alguns desses parâmetros especiais, como, por exemplo, aqueles para controlar o número máximo de argumentos, paralelismo,…)
Uma citação interessante deuma parte da documentação do GNU findutil:
[encontrar com
-exec … +
]pode ser menos eficiente do que alguns usos dexargs
; por exemplo,xargs
permite que novas linhas de comando sejam criadas enquanto o comando anterior ainda está em execução e permite especificar vários comandos para serem executados em paralelo. No entanto, afind ... -exec ... +
construção tem a vantagem de ampla portabilidade. GNU findutils não suportava '-exec ... +
' até a versão 4.2.12[Janeiro de 2005]; uma das razões para isso é que já tinha a-print0
ação '' em qualquer caso.
Responder1
A +
variante de -exec
foi introduzida no POSIX seguindoInterpretação PASC 1003.2 #210em 2001, e fundido com o padrão POSIX na edição 6 (conforme documentado no padrão atualfind(1)
documentação). De acordo com a Interpretação, todos os derivados do System V Release 4 o suportam, assim como o HP-UX (em 2001 - eu sei que o HP-UX 10 não o suporta); obviamente, qualquer sistema compatível com POSIX issue 6 ou 7 também o suporta.
O GNU-ismo é na verdade o find -print0 | xargs -0
conjunto de comandos. Se -exec ... +
estiver disponível e o -0
suporte xargs
não estiver, é definitivamente melhor usar o primeiro; mesmo -0
que não haja razão para não usar, -exec ... +
se ele suportar o que você precisa.
Responder2
Pode-se presumir com segurança que [
-exec ...
] é suportado em todos os lugares agora?
A -exec ... '{}' ';'
variante, que fornece exatamente uma correspondência por comando executado, espera-se definitivamente que seja suportada em todos os lugares agora, mesmo em sistemas unix não POSIX.
A -exec ... '{}' +
variante, não tenho certeza. É verdade que está definido emPOSIX-1, então definitivamente é suportado em todos os sistemas POSIXy atuais. No entanto, não tenho certeza se todos os sistemas Unix mais antigos (ainda em uso) o suportam.
Existem boas razões para defender xargs nos casos em que [
-exec ... '{}' +
] poderia ser usado?
Não, na verdade não. Por que usar dois comandos quando um seria suficiente?
A questão é que se a única ferramenta que você conhece é um martelo, todos os problemas parecem pregos. O poder de xargs
vem do fato de que você pode manipular a lista de correspondências usando bash
, sed
, awk
e assim por diante, antes de executar o(s) comando(s) que atuam na lista.
(Na prática, isso requer que os nomes de arquivos e diretórios não tenham novas linhas incorporadas. Bash e GNU find, sed, awk e xargs suportam caracteres nulos \0
como separadores, para que possam manipular todos os nomes de arquivos possíveis sem problemas.)