Transmita o conteúdo do diretório em vez de ler todos os itens [fechados]

1

Existe um comando unix que eu possa usar para transmitir os itens / conteúdos de um diretório? Usando o Node.js, podemos ler tudo na memória com:

fs.readdir(dir, (err, items) => {});

mas estou procurando transmitir itens para um diretório muito grande, digamos com mais de 10 milhões de pastas / arquivos.

O comando tail é para ler arquivos e não pastas TMK, então existe algum utilitário unix que possa transmitir o conteúdo de pastas?

    
por Alexander Mills 02.09.2018 / 01:16

2 respostas

1

No Unix você pode usar o comando find para transmitir arquivos & diretórios ou ambos. O comando mais básico é este:

$ find . 

Isto irá transmitir uma lista de arquivos & diretórios que podem então ser passados para outro comando através de um pipe, | ou você pode usar a capacidade incorporada de find para executar outro comando via -exec .

$ find . -type f -exec grep <somestring> {} \;

Ou

$ find . -type f | ....

Se você quiser apenas o conteúdo de um único diretório, poderá restringir a localização por meio da opção -depth :

$ find . -type f -depth 1 | ....
    
por 02.09.2018 / 02:46
2

No nível do sistema, a chamada readdir(3) é usada para retornar um fluxo de entradas de diretório, até que o erro ou a lista acabem:

 The readdir() function returns a pointer to the next directory entry in
 the named directory stream dirp.  It returns NULL upon reaching the end
 of the directory or detecting an invalid seekdir() operation.

Se e como fs.readdir é mapeado para o acima, dependerá de como essa função é implementada em JavaScript; pode haver uma maneira de chamar fs.readdir para obter entradas de diretório individuais e não lê-las todas na memória de uma só vez.

readdir(3) não é recursivo; não verificará o conteúdo de diretórios filhos; para isso, a chamada fts(3) é normalmente usada. Idiomas de nível mais alto podem usar fts(3) ou, em vez disso, podem recorrer manualmente através de sucessivas chamadas opendir , readdir e closedir para cada novo diretório filho encontrado durante o loop readdir(3) .

Implementações específicas de linguagem de alto nível podem ser ineficientes para um grande número de arquivos; Acredito que a linguagem Go possui uma implementação recursiva do sistema de arquivos simultâneo e que várias correções foram feitas ao longo dos anos para implementações.

    
por 02.09.2018 / 17:36