Existe uma forma mais simples de encontrar. -name “* substring_of_filename *” no Mac OS X e Linux?

4

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.)

    
por Arne Stenström 02.05.2011 / 16:46

10 respostas

5

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
    
por 07.05.2011 / 20:01
3

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 .)

    
por 02.05.2011 / 16:50
2

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 ".

    
por 02.05.2011 / 16:53
1

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.

    
por 04.05.2011 / 17:18
0

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.

    
por 04.05.2011 / 17:43
0

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.

    
por 07.05.2011 / 03:00
0

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
    
por 07.05.2011 / 03:08
0

Se você usar o bash 4 (com shopt -s globstar ) ou zsh:

prinftf %s\n **/*substring_of_filename*
    
por 28.03.2013 / 18:16
0

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
    
por 24.04.2013 / 11:42
-1

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 .
    
por 07.05.2011 / 21:48