Alternativa para encontrar? [fechadas]

27

Existe um programa find alternativo com uma interface CLI mais convencional? find funciona e espera parâmetros de uma maneira dolorosamente diferente da maioria dos outros utilitários.

Esclarecimento: Estou à procura de um programa que tenha basicamente a mesma funcionalidade que encontrar com uma interface de linha de comando que funcione e se pareça com as recomendações de linha de comando POSIX (ou pelo menos no GNU).

    
por Tamás Szelei 20.05.2011 / 12:12

6 respostas

11

Este é um equívoco comum.

O Find segue a sintaxe das opções. Você está confundindo expressões primárias com opções:

 find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
 [cmd][-->        options          <--] [--> arg0..argN  <--]

A alternativa é localizar. Mas o find implementa sua própria sintaxe de expressão porque fornece um conjunto mais rico de opções de filtro e ação. Não há alternativa que possa fazer o mesmo, simplesmente porque seria redundante.

    
por 20.05.2011 / 15:18
9

Depende da funcionalidade precisa de find que você está confiando. Se for (principalmente) a funcionalidade de localização, alguns shells suportam globos recursivos. Por exemplo, com zsh :

% find . -name \*c
./a/b/foo.c
./a/bar.c
./baz.c
inoshiro% ls *.c
baz.c
% ls **/*.c 
a/bar.c  a/b/foo.c  baz.c

O Zsh tem muito mais possibilidades de encontrar por meio de qualificadores da glob ( o final de man zshexpn ). Por exemplo:

ls -l **/*(.)find -type f -ls e ls *(m-2u:$USER:)find -mtime -2 -user $USER

O Bash 4 também tem **/ (você precisa ativá-lo com shopt -s globstar ), mas nada como os qualificadores glob.

    
por 20.05.2011 / 14:30
9

Eu daria uma olhada em locate . Ele procurará em seu banco de dados de arquivos e imprimirá rapidamente os nomes de caminhos que correspondem ao que você der.

kevin@box:~$ locate odg
/home/kevin/Documents/final.odg
/usr/share/doc/packages/sysconfig/netconfig.odg
/usr/share/gimp/2.0/help/en/gimp-tool-dodge-burn.html
....
kevin@box:~$ locate .odg
/home/kevin/Documents/final.odg
/usr/share/doc/packages/sysconfig/netconfig.odg
kevin@box:~$ 

Como você pode ver, é uma correspondência de subtexto: se você atribuir odg , ela corresponderá a d odg e. Mas se você der .odg , então não vai.

Existe uma desvantagem: precisa de um banco de dados. Este banco de dados precisa ser atualizado quando as coisas mudarem. Minha instalação do Fedora 13 tem isso colocado em um crontab diário.

    
por 20.05.2011 / 21:15
4

O que você está tentando encontrar? Se você está procurando por arquivos de código-fonte, dê uma olhada em ack . É basicamente uma ferramenta de pesquisa de código-fonte, mas a opção -f do ack encontrará arquivos que correspondam a um determinado tipo de arquivo.

Então, se você quiser encontrar todos os arquivos Perl em um diretório, por exemplo, apenas:

ack -f --perl

Se você não gostar dos tipos de arquivos reconhecidos pelo ack, adicione os seus próprios em ~/.ackrc .

ack não é um localizador de arquivos de uso geral como find , mas se você estiver trabalhando com código-fonte, pode ser muito útil.

    
por 16.12.2012 / 07:37
-1

Uma das grandes coisas que todo programador deve aprender é: Se você não consegue encontrar uma ferramenta, crie a sua própria!

#!/usr/bin/bash
find -name $<

Eu poderia escrever um melhor, com -t para tipos de filtro, etc.

Editar : o acima é um script Bash. Ele pega o argumento da linha de comando e o passa para encontrar o valor da opção -name. Apenas um exemplo simples. Desde que coloquei esta resposta, encontrei este script python:

link

A interface parece legal, mas eu não testei o desempenho dela. Pode valer a pena conferir.

    
por 16.12.2012 / 07:13
-2

A maneira mais comum de encontrar coisas em unix's.

du -a <directory>|grep <pattern>| awk  '{print $2}'
    
por 09.05.2017 / 08:37