breadth-first option no utilitário 'find' do Linux?

11

Existe alguma primeira opção / primeira profundidade no utilitário 'find' do Linux?

    
por Xiè Jìléi 30.09.2010 / 13:09

3 respostas

4

Não há nada embutido para encontrar, até mesmo o GNU encontrar. Você pode pós-processar a saída de find para classificar por número de barras, por exemplo, com Perl:

find ... | perl -e 'print sort {$a=~s!/!/! <=> $b=~s!/!/!} <>'
  • <> é a lista de todas as linhas de entrada;
  • $a =~ s!/!/!g é o número de barras em $a , que usamos como critério de classificação.

Se você pode usar zsh:

echo **/*(oe\''REPLY=${REPLY//[^\/]}'\')
  • **/* lista todos os arquivos no diretório atual e nos subdiretórios.
  • O material dentro dos parênteses é um qualificador glob.
  • O qualificador glob oe controla a ordem em que as correspondências são retornadas: elas são classificadas pelo valor de REPLY após a execução do código aqui entre aspas para cada correspondência com REPLY inicialmente definido para o caminho correspondente. / li>
  • Esse código transforma $REPLY para excluir tudo, exceto barras. Então o resultado consiste em tudo na profundidade 1 (vazio resultante $REPLY ), então tudo na profundidade 2 ( $REPLY acaba sendo / ), profundidade 3 ( // ), etc.
por 01.10.2010 / 01:25
2

Não

Vá para esta pergunta em SO para soluções alternativas.

    
por 30.09.2010 / 13:20
1

Meu sentimento é que você pode. Envolve grep e tal e um loop, mas acho que funciona muito bem, especificamente para o seu caso sobre a descoberta não precisar ser concluída.

É mais intensivo em recursos devido a:

  • Muita forking
  • Muitos achados
  • Cada diretório antes da profundidade atual é atingido por localizar quantas vezes houver profundidade total na estrutura do arquivo (isso não deve ser um problema se você tiver praticamente qualquer quantidade de memória RAM ...)

Isso é bom porque:

  • Ele usa ferramentas bash e básicas do gnu
  • Ele pode ser quebrado sempre que você quiser (como você vê o que você estava procurando voar)
  • Funciona por linha e não por localização, portanto, os comandos subsequentes não precisam esperar por um achado e uma classificação
  • Funciona com base na separação real do sistema de arquivos, portanto, se você tiver um diretório com uma barra, ele não será listado mais profundamente do que é; se você tiver um separador de caminho diferente configurado, você ainda está bem.
#!/bin/bash 
depth=0

while find -mindepth $depth -maxdepth $depth | grep '.'
do
    depth=$((depth + 1))
done

Você também pode ajustá-lo em uma linha com bastante facilidade (?):

depth=0; while find -mindepth $depth -maxdepth $depth | grep --color=never '.'; do depth=$((depth + 1)); done

Mas eu prefiro scripts pequenos ao digitar ...

    
por 07.12.2012 / 17:17

Tags