Em vez de usar ls, como funciona com 'find'?

2

Eu tenho este comando:

ls -Ra | grep -cve/ -e'^\.*$'

e eu gostaria de fazer exatamente o mesmo com find

Eu tentei este find . -name "^\.*$" -o -print | wc -l mas o problema é, se eu criar um novo arquivo como este: touch "^.*$" Não funcionará da mesma maneira.

Por favor, alguma ideia, como alterá-lo para que funcione da mesma forma?

    
por Mafi 20.04.2016 / 13:39

2 respostas

2

O problema

O que você está tentando fazer? Deixe-me tentar explicar seu comando para que eu entenda:

ls -Ra | grep -cve/ -e'^\.*$' fornecerá:

  • O número de arquivos, diretórios, links simbólicos, ...
  • Incluindo o diretório atual
  • Excluindo arquivos com nomes consistindo apenas de pontos: touch '...' (!!!)

A solução

Se você quiser fazer o exatamente igual com find , use:

find . -not -regex '^\.+$' | wc -l

Se a coisa com mais de dois pontos é um erro, é isso:

find . | wc -l

Ou (teoricamente) o caminho 'ls' usando o seguinte - fazendo com que a a maiúscula não imprima o diretório atual e o diretório pai:

ls -RA | grep -cve/ -e^\$

Um pouco sobre o tempo

               except multidots    all files    number of files
  ls /home                0.75s        0.70s            ~330000
find /home                0.50s        0.50s            ~330000
  ls /                    2.50s        2.50s           ~1350000
find /                    1.90s        1.70s           ~1350000
  ls / [BSD]             10.00s        8.50s            ~250000
find / [BSD]              7.50s        7.50s            ~250000

Você pode ver, encontrar é praticamente sempre mais rápido. Mas ainda não o otimizamos!

Adicionar a opção -f a ls ignora a classificação e, assim, acelera o processo em aproximadamente 30% (gerando 1,60s para / ), tornando ls -RAf | grep -cve/ -e^\$ o mais rápido de os comandos. No entanto, parece não fazer nada no FreeBSD ...

É bom saber: A extrema diferença de tempo na verificação de vários pontos no BSD (neste caso, FreeBSD) provavelmente se origina principalmente da maneira como GNU Grep trabalha e o fato de ser muito mais rápido .
Os tempos mais longos no BSD vs Linux provavelmente são apenas porque a máquina BSD em que eu testei isso é muito mais lenta, e talvez também porque está usando outro sistema de arquivos.

TL; DR

O comando mais rápido para obter o número de todos os nós do sistema de arquivos dentro de um diretório com ferramentas padrão no Linux é:

ls -RAf | grep -cve/ -e^\$

Um comando mais curto, que também é o mais rápido no FreeBSD (e, na verdade, responde à sua pergunta) é:

find . | wc -l
    
por 20.04.2016 / 16:16
0

A diferença é que, se você usar -name , só coincidirá com o nome base do arquivo. De man find :

-name pattern
     Base of  file  name  (the  path  with  the  leading  directories
     removed)  matches  shell  pattern  pattern.   The metacharacters
     ('*', '?', and '[]') match a '.' at the start of the  base  name
     (this is a change in findutils-4.2.2; see section STANDARDS CON‐
     FORMANCE below). <snip>

Para obter um comportamento semelhante ao usar ls -Ra , você deve usar -regex :

-regex pattern
     File  name  matches regular expression pattern.  This is a match
     on the whole path, not a search. <snip>
    
por 20.04.2016 / 14:45

Tags