Eu tenho diretório com cca 26 000 arquivos e eu preciso grep em todos esses arquivos. O problema é que eu preciso dele o mais rápido possível, por isso não é ideal criar scripts em que o grep pegue o nome de um arquivo no comando find e grave as correspondências no arquivo. Antes da edição da "lista de argumentos muito longa", demorava cerca de 2 minutos para grep em todos esses arquivos. Alguma ideia de como fazer? edit: existe um script que cria novos arquivos o tempo todo, portanto, não é possível colocar todos os arquivos em diretórios diferentes.
files
grep
performance
user2778979
fonte
fonte
find
withxargs
orgrep -R
Respostas:
Com
find
:(
-type f
é apenas para pesquisar em arquivos regulares (também excluindo links simbólicos, mesmo que apontem para arquivos regulares). Se você deseja pesquisar em qualquer tipo de arquivo, exceto diretórios (mas tenha cuidado, existem alguns tipos de arquivos como fifos ou / dev / zero que você geralmente não quer ler), substitua-type f
pelo específico do GNU! -xtype d
(-xtype d
corresponde a arquivos do diretório de tipos após a resolução do link simbólico)).Com o GNU
grep
:(mas lembre-se de que, a menos que você tenha uma versão recente do GNU grep, seguirá links simbólicos ao descer para diretórios). Arquivos não regulares não serão pesquisados, a menos que você adicione uma
-D read
opção.grep
Porém, versões recentes do GNU ainda não pesquisam dentro de links simbólicos.Versões muito antigas do GNU
find
não suportavam a{} +
sintaxe padrão , mas era possível usar o não-padrão:É provável que as performances sejam vinculadas à E / S. Esse é o momento de fazer a pesquisa e o tempo necessário para ler todos os dados do armazenamento.
Se os dados estiverem em uma matriz de disco redundante, a leitura de vários arquivos por vez poderá melhorar o desempenho (e degradá-los de outra forma). Se os desempenhos não estiverem vinculados à E / S (porque, por exemplo, todos os dados estão em cache) e você tiver várias CPUs, o simultâneo também
greps
poderá ajudar. Você pode fazer isso comxargs
a-P
opção do GNU .Por exemplo, se os dados estiverem em uma matriz RAID1 com 3 unidades ou se os dados estiverem em cache e você tiver 3 CPUs cujo tempo de sobra:
(aqui usando
-n1000
para gerar um novo agrep
cada 1000 arquivos, até 3 sendo executados em paralelo por vez).No entanto, observe que, se a saída de
grep
for redirecionada, você terminará com uma saída mal intercalada dos 3grep
processos; nesse caso, convém executá-la como:(em um sistema recente GNU ou FreeBSD) ou use a
--line-buffered
opção GNUgrep
.Se
pattern
for uma sequência fixa, adicionar a-F
opção pode melhorar o assunto.Se não forem dados de caracteres de vários bytes ou se for para a correspondência desse padrão, não importa se os dados são de caracteres de vários bytes ou não, então:
poderia melhorar significativamente o desempenho.
Se você acaba fazendo essas pesquisas com frequência, convém indexar seus dados usando um dos muitos mecanismos de pesquisa existentes.
fonte
26000 arquivos em um único diretório é muito para a maioria dos sistemas de arquivos. É provável que uma parte significativa do tempo seja gasta na leitura desse grande diretório. Considere dividi-lo em diretórios menores, com apenas algumas centenas de arquivos cada.
As chamadas
find
não podem explicar um desempenho ruim, a menos que você faça errado. É uma maneira rápida de percorrer um diretório e garantir que você não corra o risco de executar uma linha de comando muito longa. Certifique-se de usar o-exec grep PATTERN {} +
que empacota o máximo de arquivos possível por chamada de comando e não o-exec grep PATTERN {} \;
que executagrep
uma vez por arquivo: a execução do comando uma vez por arquivo provavelmente será significativamente mais lenta.fonte
Se você precisar grep TODOS os arquivos várias vezes (como você disse, executando um script), sugiro procurar em discos ram, copie todos os arquivos lá e depois grep os arquivos várias vezes, isso acelerará sua pesquisa por um fator de: pelo menos 100x.
Você só precisa de RAM suficiente. Caso contrário, você deve procurar a indexação dos arquivos, por exemplo. no lucene ou em um banco de dados nosql e executando consultas sobre isso.
fonte
grep
. Há também o argumento de que: "existe um script que cria novos arquivos o tempo todo, portanto, não é possível colocar todos os arquivos em diretórios diferentes".Todos os arquivos no diretório
com recursivamente
fonte
.
vez de*
).*
excluirá arquivos de ponto (embora com -R, não nos diretórios recorrentes). -R ao contrário de -r segue links simbólicos, mesmo com versões recentes do GNU grep. Você também terá um problema com os arquivos no diretório atual cujo nome começa com-