opção em primeiro lugar no utilitário `find 'do Linux?

12

Existe alguma opção de amplitude / profundidade em primeiro lugar no utilitário `find 'do Linux?

Xiè Jìléi
fonte

Respostas:

5

Não há nada embutido para encontrar, nem o GNU encontra. Você pode pós-processar a saída findpara 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 $a, que usamos como critério de classificação.

Se você pode usar o zsh:

echo **/*(oe\''REPLY=${REPLY//[^\/]}'\')
  • **/* lista todos os arquivos no diretório e subdiretórios atuais.
  • O material dentro dos parênteses é um qualificador global.
  • O qualificador glob oecontrola a ordem na qual as correspondências são retornadas: elas são classificadas pelo valor de REPLYdepois de executar o código aqui entre aspas para cada correspondência com REPLYinicialmente definido como o caminho correspondente.
  • O referido código se transforma $REPLYpara excluir tudo, exceto barras. Portanto, o resultado consiste em tudo na profundidade 1 (resultado vazio $REPLY), então tudo na profundidade 2 ( $REPLYacaba sendo /), profundidade 3 ( //), etc.
Gilles 'SO- parar de ser mau'
fonte
1
O processo de classificação é muito interessante, no entanto, a classificação precisa que a descoberta seja concluída e você não terá chance de controlar a quebra.
Xie Jìléi
2

Não

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

Nifle
fonte
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 que não precisa ser concluída.

Consome mais recursos devido a:

  • Muitos garfos
  • Muitas descobertas
  • Cada diretório antes que a profundidade atual seja atingida encontra 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 básicas e básicas de gnu
  • Pode ser quebrado sempre que você quiser (como você vê o que estava procurando voar)
  • Funciona por linha e não por localização, portanto, os comandos subseqüentes não precisam esperar por uma localização 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, ainda estará bem.
#! / bin / bash 
depth = 0

enquanto encontrar -mindepth $ depth -maxdepth $ depth | grep '.'
Faz
    depth = $ ((profundidade + 1))
feito

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

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

Mas eu prefiro pequenos scripts do que digitar ...

ClashTheBunny
fonte