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


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?

Tal como:

findfile . substring_of_filename

(Nota: A pergunta originalmente escrita usada app_config como um exemplo de substring_of_filename.)


4


origem


locate app_config - knittl
@knittl: Mas locate não está restrito ao diretório atual e é subdiretório. - user unknown


Respostas:


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

5





Aqui está sua função bash, coloque-a .bashrc:

function findfiles { find "$1" -iname "*$2*"; }

(Observe que -iname torna a pesquisa insensível a maiúsculas e minúsculas. Se você não quiser isso, use -name em vez de.)


3



Você também pode executar isso em uma sessão bash se quiser usá-lo apenas para a sessão atual. - Wuffers
iname não é equivalente, name é. Pode ser o seu uso favorito, mas não foi a questão. - user unknown


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


2



parece não ser verdade, pelo menos no Mac OS X
O que parece não ser verdade? Que você pode omitir o ponto? Ou que um arquivo que contenha 'app_config' em seu nome e que esteja no diretório atual, restringirá a pesquisa ao seu nome. - user unknown
Quero dizer, no Mac OS X, você pode usar find . -name *app_config* sem as aspas
@BenU: Eu não tenho um sistema com Mac OS X, mas no Linux, a necessidade de cotações surge do shell. Se eu não citar o "*", o shell tenta expandi-lo. Não é necessário necessário encontrar, e não, se o * não corresponde a algo no diretório atual - então ele é passado inalterado para ser encontrado. Você pode tentar aspas simples, que também são permitidas no bash, mas impediriam a expansão das variáveis ​​(o que não é o caso aqui, mas às vezes mais) -name "*.pdf.$id" por exemplo. - user unknown
Para o registro, citações devemos ser usado no OS X da mesma maneira que no Linux, já que o OS X possui o mesmo shell Bash que o Linux. - Arne Stenström


Coloque isso no seu ~/.profile ou ~/.bashrc, não tenho certeza qual deles usa o Mac:

findname () 
{ 
    find . -name "*$1*"
}

em seguida, chame a função 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 é a seguinte:

findname() 
{ 
    find .|grep $1|grep $2|grep $3|grep $4 
}

Isso vai encontrar todos os arquivos em seu diretório atual, procurar pela string 1, depois pesquisar o resultado para a string 2 e etc, até chegar a 4.


1



A segunda função não funciona a menos que as variáveis ​​sejam citadas como find . |grep "$1" |grep "$2" |grep "$3" |grep "$4". Além disso, ele procura partes do caminho em vez de partes de nomes de arquivos. - Arne Stenström


Em vez de fazer isso em um script bash, zsh, tcsh, sh, etc ... eu fiz um TextExpander atalho. Eu digito sh≤Space≥ e tipos TE

encontrar . -inome "**"

e coloca o cursor entre os asteriscos.


0





No OS X, porque não basta 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.


0



Em alguns cenários, o locateb é um risco de segurança. O diretório inicial criptografado pelo LUKS + a raiz não criptografada + a indexação atualizada / home eo armazenamento do cache em algum lugar em / var (que não é criptografado) vazam nomes de arquivos de / home. - vtest


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

0





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

prinftf %s\\n **/*substring_of_filename*

0





A resposta é não". Não há atalho para "localizar arquivo por nome do arquivo com substring no diretório atual ou abaixo" no GNU find. Os aliases que uso para contornar essa limitação são os seguintes (por 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

0



Se alguém colocar esses portfólios no shell de sua escolha, sinta-se à vontade para editar este post e adicionar sua versão. - Alex Hirzel


Eu acho que apenas o grep pode fazer isso bem, sem necessidade de encontrar. Opções relevantes da manpage:

 -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, ainda sugiro que você o use explicitamente. Esse switch resolve um problema específico do seu, é melhor lembrar esse pouco de conhecimento diretamente relacionado do que o caso de borda (pesquisar vários arquivos) quando essa opção é o padrão.

Portanto, a versão grep do seu comando original de localização ficará assim:

grep -lHR app_config .

-1



Eu suspeito que "todos os arquivos com o app_config nele" realmente significam "todos os arquivos com o app_config em seus nomes". - Eroen