Na prática, o kernel armazenará em cache o executável e qualquer arquivo necessário (por exemplo, bibliotecas) na RAM.
O shell não tem como fazer nada. Se for um programa externo, ele precisa ser executado. Unices (excluindo camadas de emulação unix como Cygwin) tendem a tornar o carregamento de um programa bastante eficiente, mas nunca será tão rápido quanto a execução de um comando interno.
Você pode economizar tempo agrupando as chamadas para touch
. Primeiro, você nunca deve usar a substituição de comando na saída de find
: isso não tem absolutamente nenhuma vantagem, mas várias desvantagens:
- Ele será interrompido se você tiver nomes de arquivos contendo caracteres em branco ou globbing.
- É mais lento, porque o primeiro
find
precisa completar sua passagem da árvore de diretórios e somente então o processamento é iniciado. - Ele usa mais memória para armazenar a saída de
find
.
Em vez de fazer um loop nos resultados, faça find
executar o comando. find
é projetado para esse tipo de uso.
find . -name "*.xml" -exec touch {} \;
Agora, como touch
pode processar muitos arquivos de uma só vez, basta substituir \;
por +
e voilà, touch
será chamado em lotes contendo o maior número de arquivos possível.
find . -name "*.xml" -exec touch {} +
Se você precisar de desempenho em um script de shell, os componentes internos sempre vencerão comandos externos, a menos que você esteja manipulando grandes quantidades de dados. Por exemplo, usar as construções de processamento de string do shell é muito mais rápido (e menos propenso a erros devido a problemas de cotação) do que chamar sed
se você tiver uma linha de texto. Por outro lado, use sed
ou outras ferramentas externas especializadas se você tiver milhões de linhas para processar.
Se você estiver criando novos arquivos, poderá substituir o uso de touch -- "$file"
por : >"$file"
. Não existe esse atalho para alterar a data de um arquivo existente para a hora atual.
Os shells têm alguns comandos internos que podem ser implementados como comandos externos, mas são internos para desempenho. echo
é um excelente exemplo. Há também shells com builtins adicionais para uso em situações de resgate onde comandos externos podem ser quebrados, ou quando a tabela de processos está cheia, etc. Por exemplo, o zsh vem com o zsh/files
module contém comandos como mkdir
e mv
, mas não touch
. Sash tem -touch
embutido.