(Estou assumindo o GNU findaqui)
Usando apenas
find filename
seria rápido, porque retornaria apenas filename, ou os nomes dentro, filenamese for um diretório, ou um erro se esse nome não existir no diretório atual. É uma operação muito rápida, semelhante a ls filename(mas recursiva se filenamefor um diretório).
Em contraste,
find | grep filename
permitiria findgerar uma lista de todos os nomes do diretório atual e abaixo, que grepseriam filtrados. Obviamente, isso seria uma operação muito mais lenta.
Estou assumindo que o que realmente era pretendido era
find . -type f -name 'filename'
Seria filenameo nome de um arquivo comum em qualquer lugar do diretório atual ou abaixo.
Isso será tão rápido (ou comparativamente rápido) quanto find | grep filename, mas a grepsolução corresponderia filenameao caminho completo de cada nome encontrado, da mesma forma que -path '*filename*'faria com find.
A confusão vem de um mal-entendido de como findfunciona.
O utilitário usa vários caminhos e retorna todos os nomes abaixo desses caminhos.
Em seguida, você pode restringir os nomes retornados usando vários testes que podem atuar no nome do arquivo, no caminho, no registro de data e hora, no tamanho do arquivo, no tipo de arquivo etc.
Quando voce diz
find a b c
você perguntar findpara listar todos os nomes disponíveis sob as três caminhos a, be c. Se esses forem nomes de arquivos regulares no diretório atual, eles serão retornados. Se algum deles for o nome de um diretório, ele será retornado juntamente com todos os outros nomes dentro desse diretório.
Quando eu faço
find . -type f -name 'filename'
Isso gera uma lista de todos os nomes no diretório atual ( .) e abaixo. Em seguida, restringe os nomes aos arquivos comuns, ou seja, não diretórios etc., com -type f. Depois, há uma restrição adicional aos nomes que correspondem ao filenameuso -name 'filename'. A string filenamepode ser um padrão globbing de nome de arquivo, como *.txt(lembre-se de citá-la!).
Exemplo:
O seguinte parece "encontrar" o arquivo chamado .profileno meu diretório pessoal:
$ pwd
/home/kk
$ find .profile
.profile
Mas, na verdade, apenas retorna todos os nomes no caminho .profile(existe apenas um nome e esse é o arquivo).
Então cdsubo um nível e tente novamente:
$ cd ..
$ pwd
/home
$ find .profile
find: .profile: No such file or directory
O findcomando agora não pode encontrar nenhum caminho chamado .profile.
No entanto, se eu procurar o diretório atual e restringir apenas os nomes retornados.profile , ele também será encontrado a partir daí:
$ pwd
/home
$ find . -name '.profile'
./kk/.profile