Localiza arquivos em um caminho

1

Eu quero procurar um tipo de arquivo específico (.jpeg) em um determinado caminho de maneira muito eficiente.

Atualmente tenho 2 opções

  1. ls- R | grep .jpeg
  2. use 'find'

qual é melhor um? existe alguma abordagem melhor do que isso?

    
por Girish Kolari 15.12.2009 / 12:43

9 respostas

6

Eu usaria find /somewhere/on/disk -name "*.jpeg" over ls .

Existe também a opção locate *.jpeg que faz uso de um banco de dados. No entanto, esse banco de dados é atualizado apenas em intervalos regulares (geralmente de um cron job), portanto, alguns arquivos podem não ter sido indexados no momento em que você está invocando o comando locate , produzindo um resultado menos preciso. Você pode forçar a criação ou atualização desse banco de dados invocando o comando updatedb .

Sobre find vs ls performance, ls classificará a saída que leva tempo, enquanto você não precisa necessariamente dela. Além disso, ls produzirá muitas informações que precisam ser filtradas por grep posteriormente.

Referência:

por 15.12.2009 / 12:46
3

Sempre fui fã de encontrar, há muito o que você pode fazer com isso:

find /starting/path -type f -name "*.jpeg"

Então, se eu quisesse começar no meu diretório pessoal:

find /home/john -type f -name "*.jpeg"

Você pode querer procurar por .jpg e .jpeg (extensões de 3 letras dos dias do DOS), pois os arquivos podem ser nomeados de qualquer forma:

find . -type f \( -name "*.jpg" -o -name "*.jpeg" \)
    
por 15.12.2009 / 12:55
2

Depende do que você quer como resultado. ls -R não informará em qual diretório ele encontrou o arquivo, enquanto find será.

Além disso, ls -R gera mais saída, que é subsequentemente filtrada, enquanto find procura especificamente o que você deseja. Sem ter medições, eu acho que find é geralmente mais eficiente.

    
por 15.12.2009 / 12:50
1

Eu costumo usar

      find . -name *.jpg -print {} \;
    
por 15.12.2009 / 16:43
1

Você também pode querer combinar os arquivos em .JPG e .JPEG em letras maiúsculas. Com find, você pode adicionar -name '*.JPG' -name '*.JPEG' , ou você pode encontrar um grep (sim, é um pouco feio):

find . -type f | grep "\.[Jj][Pp][Ee]\?[Gg]$"

Isto irá corresponder:

  • foo.jpg
  • bar.jpeg
  • foo.JPG
  • bar.JPEG
por 16.12.2009 / 10:47
1

find ./ -name *.jpg -print

    
por 15.12.2009 / 12:48
0

Instalar "localizar" ou "deslocar"

Execute "updatedb" e "locate \ *. jpeg"

updatedb cria um banco de dados de índice para os nomes de arquivos em seu sistema.

locate localizará o arquivo do banco de dados em vez do diretório de verificação por diretório.

É mais rápido descobrir se você está pesquisando muito após cada compilação do banco de dados. Você pode querer configurar um cron job para executar o comando updatedb.

Isso é como o Google Desktop Search, mas apenas para pesquisar nome de arquivo.

    
por 15.12.2009 / 16:02
0

Encontrar é definitivamente a melhor ferramenta para este trabalho.
A saída de ls-R será difícil de analisar (os nomes dos arquivos são intercalados com os nomes dos diretórios). Além disso, com ls, você terá dificuldade em lidar com nomes com espaços, enquanto encontrar. -name '* .jpeg' -print0 gerará uma lista separada por caracteres nulos. xargs, grep e outros têm a opção de ler esse tipo de entrada. Isso significa que todos os nomes estranhos são preservados.

    
por 15.12.2009 / 21:17
0

Diferente da diferença óbvia com o pipe, ambas as versões podem ser vistas como iguais. A implementação ( ls.c vs. find.c tirado do busybox) parece o mesmo ao procurar por arquivos. Você também pode encurtar o primeiro:

ls -R *.jpeg
    
por 15.12.2009 / 12:48

Tags