O shell não é capaz de chamar grep
com muitos arquivos, ou melhor, o comprimento da linha de comando 1 para chamar um utilitário externo tem um limite, e você está acertando quando o shell tenta chamar grep
com o padrão expandido cdr/173/07/cdr_2018_07*
globbing.
O que você pode fazer é para grep cada arquivo individualmente, com
for pathname in cdr/173/07/cdr_2018_07*; do
grep "IP" "$pathname" /dev/null
done
em que o /dev/null
extra forçará grep
a sempre informar o nome do arquivo do arquivo correspondente ou você pode usar find
:
find cdr/173/07 -maxdepth 1 -type f -name 'cdr_2018_07*' \
-exec grep "IP" /dev/null {} +
que será mais eficiente, pois grep
será chamado com tantos nomes de caminhos correspondentes quanto possível em lotes.
Também pode ser que, se você primeiro cd
em cdr/173/07
e faça
grep "IP" cdr_2018_07*
pode funcionar uma vez que a lista gerada de nomes de arquivos seria mais curta devido a não conter os bits do diretório, mas você provavelmente está muito próximo do limite com 44.7k arquivos e deve considerar seriamente mudar para Outra maneira de fazer isso, especialmente se você está esperando o número de arquivos para flutuar em torno desse número.
Relacionados:
- Entendendo a opção -exec de 'localizar'
- O que define o tamanho máximo para um único argumento de comando? (tangencialmente relacionado)
-
Outras perguntas sobre U & L relativo a "lista de argumentos muito longa"
1 O limite está no comprimento combinado na linha de comando e o comprimento do ambiente (a soma do comprimento de cada argumento e variável de ambiente) nome e valor, também considerando os ponteiros para eles), e é um limite imposto pela chamada de sistema execve()
que é usada pelo shell para executar comandos externos. Comandos incorporados, como echo
etc., não têm esse problema.