Alternativa para encontrar? [fechadas]

30

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

Esclarecimento: Estou procurando um programa que possua principalmente a mesma funcionalidade que encontrar com uma interface de linha de comando que funcione e pareça com as recomendações de linha de comando POSIX (ou pelo menos GNU).

Tamás Szelei
fonte
7
A localização do GNU não respeita as diretrizes POSIX (ou mesmo GNU) para linha de comando. Por exemplo, a ordem dos parâmetros, as opções de vários caracteres com um único traço etc. são diferentes das dos programas em conformidade.
Tamás Szelei
3
Eu sei, e sempre posso fazer o que pretendo, de um jeito ou de outro. Recentemente, eu fiquei sabendo acke me perguntei se havia algo melhor findtambém.
Tamás Szelei
2
Não. Veja bem, eu não quero uma linguagem de programação pequena, mas uma descoberta mais simples, intuitiva e consistente (mesmo que isso signifique a perda de algumas funcionalidades avançadas). Quando eu enfrento uma tarefa que justifica escrever um programa, eu o faço.
Tamás Szelei
2
O achado é consistente (veja minha resposta) e intuitivo. Não é como se as primárias fossem nomeadas estranhas. -exec significa executar, -print significa imprimi-lo, -name significa corresponder a um nome. Na prática, o antigo tipo 3 e abrange 95% dos casos de uso. Para todos os outros casos, há quem encontre.
2020 Mel
3
@tamas Eu editei uma hora atrás e disse que não há alternativa, exceto localizar. E talvez l -R venha a pensar nisso. Outras alternativas são os programas da GUI que emulam a localização. Caso contrário, você deve especificar o que deseja que sua alternativa de localização faça. Andar em direção a árvores? Filtrar nomes de arquivos? Diga quais arquivos são mais novos, então?
Mel

Respostas:

11

Este é um equívoco comum.

A localização segue a sintaxe das opções. Você está apenas confundindo primárias de expressão 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.

Mel
fonte
5
Mesmo que seja minha culpa, isso não responde à minha pergunta.
Tamás Szelei
Qual é a diferença entre expression (only one allowed?), Cmd (aqui?), Options e args?
usuário desconhecido
@user unknown - o comando find implementa sua própria sintaxe de expressão. A expressão, quando fornecida, é o último argumento na linha de comando. Quando ausente, a expressão resolve imprimir.
2020 Mel
Ah - agora entendo, [cmd] não está seguindo [expressão], mas é uma descrição da linha anterior.
usuário desconhecido
2
O OP afirma que find"espera parâmetros de uma maneira dolorosamente diferente da maioria dos outros utilitários". Você afirma que o OP está "confundindo primárias de expressão com opções". A maioria dos outros utilitários ainda tem um conceito de "expressões primárias"? Caso contrário, isso não demonstra o ponto de vista do OP? E essa não é realmente a parte mais estranha de usar find. Que outra CLI envolve {}(que, é claro, deve ser evitada de alguma forma)?
Kyle Strand
10

Depende da funcionalidade precisa da findqual você está confiando. Se é (principalmente) a funcionalidade de localização, algumas conchas suportam globs 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 busca através de qualificadores glob (olhe perto do final de man zshexpn). Por exemplo:

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

O Bash 4 também possui **/(você precisa habilitá-lo shopt -s globstar), mas nada como qualificadores globais.

jmtd
fonte
10

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

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 odgcorrespondência de subtexto : se você fornecer , ela corresponderá a odg e. Mas se você der .odg, não dará.

Porém, há uma desvantagem: ele precisa de um banco de dados. Esse banco de dados precisa ser atualizado quando as coisas mudarem. Minha instalação do Fedora 13 colocou isso em um crontab diário, no entanto.

Kevin M
fonte
Eu amolocate
Andrew Lambert
1
Além disso, o local também aceita padrões (eu aprendi isso recentemente).
Adam Byrtek
5

O que você está tentando encontrar? Se você normalmente procura arquivos de código-fonte, dê uma olhada ack. É basicamente uma ferramenta de busca de código-fonte, mas o -fswitch da ack encontrará arquivos que correspondem a um determinado tipo de arquivo.

Portanto, se você deseja encontrar todos os arquivos Perl em um diretório, por exemplo, apenas:

ack -f --perl

Se você não gosta dos tipos de arquivos que reconhece, pode adicionar os seus ~/.ackrc.

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

Andy Lester
fonte
1
Não é isso que o usuário solicitou, mas as pessoas podem achar muito útil para encontrar no código fonte (como grep) The Silver Searcher , silversearcher-agpacote nas principais distribuições.
Pablo A
-1

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

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

Eu poderia escrever um melhor, com -tpara filtrar tipos, etc.

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

https://github.com/sjl/friendly-find/

A interface parece boa, mas não testei seu desempenho. Pode valer a pena conferir.

xixixao
fonte
1
Verdadeiro para criar uma declaração de ferramenta própria. Mas pelo menos explique como o seu pequeno script deve funcionar.
jippie
1
$<não está fazendo nada de útil no meu Bash. O que você espera que ele faça? Você quer dizer "$@"realmente? Ou "$1"(que é basicamente o que isso significa em um Makefile)?
Tripleee
1
@ tripleee - $<é o cshequivalente a read- eu acho que ele quis dizer isso.
DarkHeart 9/05
-2

A maneira mais comum de encontrar coisas no unix.

du -a <directory>|grep <pattern>| awk  '{print $2}'
johny smith
fonte
1
grep | awké um antipadrão. Veja o uso inútil degrep . Se você quiser parametrizar o padrão, talvezdu -a | awk -v "pat=<pattern>" '$0 ~ pat { print $2 }'
tripleee
@tripleee Essas informações são muito úteis awk, mas uma das grandes vantagens da filosofia do UNIX é que não é necessário entender todos os recursos das ferramentas mais complexas (como awke find) para construir pipelines que possam executar o desempenho desejado. tarefa. grep | awkpode não ser o ideal (ou, em um sistema multithread com desempenho altamente otimizado grep, talvez seja!), mas é simples .
Kyle Strand