find comando, existe uma maneira de obter um relatório de progresso?

3

em primeiro lugar, por favor, perdoe a minha falta de conhecimento do Unix - é por isso que estou aqui depois de tudo. Eu criei um AppleScript que procura por arquivos em um Mac e melhorou muito a velocidade usando o seguinte comando:

set MySubfolderTextList to do shell script "find " & MyDirectory & " -type d"

Em Unix simples, isso seria find MyDirectory -type d

Isso me fornece uma lista de todas as subpastas recursivamente a partir do nível superior da pasta chamada MyDirectory . Agora, a velocidade disso é incrível em comparação com a rotina antiga que fiz com o AppleScript normal, mas quando executo esse script em uma pasta com milhares de subdiretórios, recebo uma pequena bola de praia por alguns segundos ou minutos, indicando que algo está acontecendo ou o sistema caiu. Eu estava esperando que eu pudesse obter algum feedback do Unix sobre o andamento da pesquisa, caso contrário, meus clientes vão surtar que o programa caiu.

    
por Dr Scripto 26.05.2016 / 11:20

2 respostas

2

Não realmente. Considere que find não sabe o que está na árvore de diretórios, mas descobre lendo recursivamente por todas as listagens de diretórios. (desculpe pelo trocadilho.) Por exemplo, pode haver dois diretórios de primeiro nível, um dos quais tem 1 arquivo, e outro que tem arquivos 1000000.

Algo como copiar a árvore seria diferente, pois um programa poderia primeiro pesquisar a árvore para descobrir o número e o tamanho de todos os arquivos e usá-la para estimar a conclusão. Isso pode ser feito já que os tamanhos dos arquivos são armazenados explicitamente, não há necessidade de ler um arquivo inteiro para encontrar seu tamanho. Mas, até onde sei, nenhum sistema de arquivos comum salva informações sobre o número de arquivos em uma árvore. (Não que isso fosse impossível, mas mesmo que algum sistema faça isso, o find teria que ser modificado para usar a informação.)

Agora, quanto à bola de praia e à impressão de congelamento, você está executando o sub-processo de forma síncrona, de modo que a interface do usuário seja bloqueada enquanto é executada? Isso geralmente é uma má idéia, e você pode querer procurar maneiras de executar o programa externo em segundo plano, enquanto mostra uma mensagem "Ainda pesquisando ...". Com uma opção para abortar a pesquisa se o usuário ficar impaciente.

    
por 26.05.2016 / 11:48
1

Você pode usar o comando pv se tiver para contar linhas. Por exemplo

 find ~ -type d | pv -l -F '%b dirs found' >/tmp/output
    
por 26.05.2016 / 12:37