Depende principalmente da sua versão do kernel do Linux.
Você poderá ver o limite do seu sistema executando
getconf ARG_MAX
que informa o número máximo de bytes que uma linha de comando pode ter após ser expandida pelo shell.
No Linux <2.6.23, o limite geralmente é de 128 KB.
No Linux> = 2.6.25, o limite é de 128 KB ou 1/4 do tamanho da pilha (consulte ulimit -s
), o que for maior.
Veja a página de manual execve (2) para todos os detalhes.
Infelizmente, a tubulação ls *.txt
não vai resolver o problema, porque o limite está no sistema operacional, não no shell.
O shell expande o *.txt
e tenta chamar
exec("ls", "a.txt", "b.txt", ...)
e você tem tantos arquivos correspondentes *.txt
que está excedendo o limite de 128 KB.
Você terá que fazer algo como
find . -maxdepth 1 -name "*.txt" | wc -l
em vez de.
(E veja os comentários de Shawn J. Goff abaixo sobre nomes de arquivos que contêm novas linhas.)
ls
de saída , que é uma má idéia, então é melhor evitá-lo. Para contar, consulte Qual é a melhor maneira de contar o número de arquivos em um diretório? , para uma solução alternativa complicada, veja por que o loop for não gera o erro "argumento muito longo"? .