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 .