Como obter diretórios e subdiretórios e contar o caminho mais rápido?

2

Eu quero obter o número de diretórios e sub-diretórios. Eu tentei seguir o comando que leva muito tempo. Eu tentei esperar cerca de uma hora para terminar o comando.

comandos que usei

$ find . -type d | wc -l

e

$ du -ch | wc -l 

Os dois comandos demoraram mais de 1 hora e não foram concluídos. O tamanho da pasta principal que estou tentando obter é de cerca de 120 GB.

    
por Özzesh 24.02.2014 / 06:26

2 respostas

3

Se você quer apenas um único nível, então há um truque para fazer isso sem ter que enumerar o diretório. Se você quiser recursão, então o que você tem é o melhor que você vai conseguir.

O truque de um único nível:

stat --printf='%h\n' /path/to/dir

... e subtrai 2. O resultado é o número de diretórios dentro desse diretório (não recursivo).

Esse comando mostra o número de links físicos no arquivo especificado. Sempre que você criar um diretório dentro de um diretório, o subdiretório terá uma entrada de link físico para o diretório pai, o .. . Então, criando um subdiretório, você aumenta o número de hard links para o diretório pai em um. Mas subtraímos 2 porque todo diretório começa com 2 hardlinks. Um hardlink está no diretório pai e aponta para ele: a entrada dir dentro de /path/to . O outro hardlink é o diretório que contém um link para si mesmo: a entrada . .

No entanto, com recursão, você precisa examinar cada diretório. O problema é que não há como dizer "me dê uma lista de apenas diretórios dentro desse diretório". Você precisa obter uma lista de cada entrada no diretório e, em seguida, stat cada uma para descobrir se é um diretório ou um arquivo.

Agora, quando você faz o stat directory, você pode usar o truque de hardlink acima para descobrir se o diretório contém algum subdiretório, e assim você pode economizar um pouco de tempo e não descer nesse diretório. O utilitário find realmente usa esse truque para obter um pequeno ganho de desempenho no processo.

Então, basicamente, usar find será o melhor que você pode fazer se quiser recursão.

    
por 24.02.2014 / 07:40
2

find . -type d | wc -l não fornece o valor correto se houver novas linhas em algum lugar. Além disso, conta o diretório inicial que provavelmente não é pretendido. Eu não acredito que o pipeline é o gargalo, mas isso pode ser facilmente otimizado:

find . -mindepth 1 -type d -printf . | wc -c
    
por 24.02.2014 / 07:36