No Mac OS X, você também pode colocar um alias usando mdfind
em .bashrc:
# mdfind uses Spotlight
alias findf='mdfind -onlyin . -name'
findf app_config
No Mac OS X ou Linux, existe uma forma mais simples do comando
find . -name "*substring_of_filename*"
que é encontrar todos os arquivos com nomes contendo substring_of_filename
dentro do diretório atual (ou algum outro diretório). Porque é uma coisa comum de se fazer, existe uma maneira de tornar o comando mais curto e fácil de digitar, possivelmente usando um alias ou uma função no Bash? Ou há algum outro comando fácil de usar que possa ser usado?
Como:
findfile . substring_of_filename
( Nota: A questão originalmente escrita usada app_config como um exemplo de substring_of_filename.)
No Mac OS X, você também pode colocar um alias usando mdfind
em .bashrc:
# mdfind uses Spotlight
alias findf='mdfind -onlyin . -name'
findf app_config
Aqui está sua função bash, coloque-a em .bashrc
:
function findfiles { find "$1" -iname "*$2*"; }
(Observe que -iname
torna a busca insensível ao caso. Se você não quiser, use -name
.)
Au contraire! Há um ainda mais complicado, mas um, que funciona:
find . -name "*app_config*"
O ponto não é necessário para o gnu-find:
find -name "*app_config*"
Mas você tem que mascarar os asteriscos, senão eles serão interpretados pelo shell, e você só encontrará nomes de arquivos que coincidam com aqueles no diretório atual, que correspondem " app_config ".
Coloque isso no seu ~/.profile
ou ~/.bashrc
, não sei ao certo qual Mac usa:
findname ()
{
find . -name "*$1*"
}
chame a função por findname name_of_file
Se você quisesse usar várias palavras, teria que se complicar mais. A maneira mais fácil de pensar de improviso é esta:
findname()
{
find .|grep $1|grep $2|grep $3|grep $4
}
Isso encontrará todos os arquivos em seu diretório atual, pesquisará pela string 1, depois procurará pelo resultado da string 2 e etc, até chegar a 4.
Em vez de fazer isso em um script bash, zsh, tcsh, sh, etc ..., fiz um TextExpander
encontre. -inome "**"
e coloca o cursor entre os asteriscos.
No OS X, por que não usar o locate? Concedido o locateb não é atualizado com muita freqüência por padrão, mas você pode mudar isso facilmente (alterar o agendamento periódico de trabalho no OS X). locate é um BSDism, não sei se está no Linux ou não.
Na maioria das distribuições Linux, você pode usar o locate. Por exemplo:
$ locate find | grep bin
/sbin/findfs
/usr/bin/find
/usr/bin/find2perl
/usr/bin/findsmb
/usr/bin/gst-typefind-0.10
/usr/bin/memdiskfind
/usr/bin/oldfind
/usr/bin/sane-find-scanner
/usr/include/c++/4.5/ext/pb_ds/detail/bin_search_tree_/find_fn_imps.hpp
/usr/include/c++/4.5/ext/pb_ds/detail/binary_heap_/find_fn_imps.hpp
/usr/include/c++/4.5/ext/pb_ds/detail/binomial_heap_base_/find_fn_imps.hpp
Se você usar o bash 4 (com shopt -s globstar
) ou zsh:
prinftf %s\n **/*substring_of_filename*
A resposta é "não". Não existe uma abreviação para "localizar arquivo por nome do arquivo com substring no diretório atual ou abaixo" no GNU find
. Os aliases que eu uso para contornar essa limitação são os seguintes (para zsh
):
# find file in cwd by [S]ubstring, case [I]nsensitive, change to first sub[D]irectory
finds() { find . -name "*$**"; }
findsi() { find . -iname "*$**"; }
findsid() { cd 'find . -iname "*$**" | head -n1 | xargs dirname'; }
O último é meu favorito. Estes podem ser usados da seguinte forma:
> ls -R
.:
file1 File2 HOLEFILE test
./test:
hello
(esse é o diretório de teste)
> findsi file
./HOLEFILE
./File2
./file1
> finds file
./file1
> finds le
./File2
./file1
> findsid ell
> ls
hello
Eu acho que apenas o grep pode fazer isso bem, sem necessidade de encontrar. Opções relevantes da página de manual:
-l, --files-with-matches
Suppress normal output; instead print the name of each input
file from which output would normally have been printed. The
scanning will stop on the first match. (-l is specified by
POSIX.)
-H, --with-filename
Print the file name for each match. This is the default when
there is more than one file to search.
-R, -r, --recursive
Read all files under each directory, recursively; this is
equivalent to the -d recurse option.
Observe que, mesmo que -H seja o padrão quando houver mais de um arquivo para pesquisar, sugiro que você o use explicitamente. Esse switch resolve um problema específico de vocês, é melhor lembrar esse pouco de conhecimento diretamente relacionado do que o caso de borda (procurar múltiplos arquivos) quando esta opção é a padrão.
Assim, a versão grep do seu comando original de localização ficará assim:
grep -lHR app_config .