Uma opção, se os nomes dos seus arquivos não contiverem citações ou espaços em branco, seria juntá-los com cat :
printf '%s ' * | xargs cat | awk ...
O texto acima simplesmente contorna o erro "lista de argumentos muito longa" usando um builtin ( printf ) para imprimir cada nome de arquivo, que é enviado para xargs , que divide os nomes dos arquivos em lotes que envia para cat , cuja saída é então enviada para awk .
Se você tem o GNU awk disponível (gawk) na versão 4.1 ou superior , onde o carregamento do módulo dinâmico foi introduzido, ele contém uma extensão que pode ler um diretório em si, evitando o problema.
Aqui está um exemplo de programa gawk que irá abrir e ler os arquivos em qualquer diretório que você passar para ele; você então terá que ler explicitamente de cada arquivo que você está interessado. O benefício é que você tem um único programa (GNU) awk que lerá todos os arquivos.
@load "readdir"
@load "filefuncs"
BEGIN { FS = "/" }
{
result = stat($2, statdata)
if (statdata["type"] != "file")
next
FS = " "
while(getline < statdata["name"] > 0) {
#print $1
}
FS = "/"
}
O loop principal do script passa por todos os argumentos dados na linha de comando e tenta abri-lo como um diretório. Os campos resultantes são:
- $ 1 = número do inode
- $ 2 = nome do arquivo
- $ 3 = tipo de arquivo
Em seguida, usamos a função filefuncs stat para verificar o tipo do arquivo. Se não for um arquivo simples, nós o ignoramos. Caso contrário, definimos FS de volta para o valor normal e usamos getline para ler o arquivo. Depois que terminamos com cada arquivo, redefinimos o FS de volta para / para que ele possa dividir o próximo nome de arquivo de readdir .
Aprendi sobre o leia o documento aqui e sobre stat do arquivo do gawk aqui .