Existe um find
programa 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 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).
command-line
software-rec
find
utilities
Tamás Szelei
fonte
fonte
ack
e me perguntei se havia algo melhorfind
também.Respostas:
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:
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.
fonte
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 usarfind
. Que outra CLI envolve{}
(que, é claro, deve ser evitada de alguma forma)?Depende da funcionalidade precisa da
find
qual você está confiando. Se é (principalmente) a funcionalidade de localização, algumas conchas suportam globs recursivos. Por exemplo, comzsh
: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á-loshopt -s globstar
), mas nada como qualificadores globais.fonte
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.Como você pode ver, é uma
odg
correspondê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.
fonte
locate
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-f
switch 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:
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.fonte
silversearcher-ag
pacote nas principais distribuições.Uma das grandes coisas que todo programador deve aprender é: Se você não encontrar uma ferramenta, crie a sua!
Eu poderia escrever um melhor, com
-t
para 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.
fonte
$<
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)?$<
é ocsh
equivalente aread
- eu acho que ele quis dizer isso.A maneira mais comum de encontrar coisas no unix.
fonte
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 }'
awk
, mas uma das grandes vantagens da filosofia do UNIX é que não é necessário entender todos os recursos das ferramentas mais complexas (comoawk
efind
) para construir pipelines que possam executar o desempenho desejado. tarefa.grep | awk
pode não ser o ideal (ou, em um sistema multithread com desempenho altamente otimizadogrep
, talvez seja!), mas é simples .