(estou assumindo o% GNUfind aqui)
Usando apenas
find filename
seria rápido, porque apenas retornaria filename , ou os nomes dentro de filename se fosse um diretório, ou um erro se esse nome não existisse no diretório atual. É uma operação muito rápida, semelhante a ls filename (mas recursiva se filename for um diretório).
Em contraste,
find | grep filename
permitiria find gerar uma lista de todos nomes do diretório atual e abaixo, que grep filtraria. Esta obviamente seria uma operação muito mais lenta.
Suponho que o que era realmente pretendido era
find . -type f -name 'filename'
Isso procuraria filename como o nome de um arquivo regular em qualquer lugar no diretório atual ou abaixo.
Isso será tão rápido (ou comparativamente rápido) quanto find | grep filename , mas a solução grep corresponderia a filename em relação ao 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 find funciona.
O utilitário usa vários caminhos e retorna todos os nomes abaixo desses caminhos.
Você pode então restringir os nomes retornados usando vários testes que podem atuar no nome do arquivo, no caminho, no timestamp, no tamanho do arquivo, no tipo de arquivo, etc.
Quando você diz
find a b c
você solicita que find liste todos os nomes disponíveis nos três caminhos a , b e c . Se estes 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 junto com todos os outros nomes dentro desse diretório.
Quando 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 dos arquivos regulares, ou seja, não diretórios, etc., com -type f . Em seguida, há uma restrição adicional aos nomes que correspondem a filename usando -name 'filename' . A string filename pode ser um padrão de globbing de nome de arquivo, como *.txt (lembre-se de citá-lo!).
Exemplo:
O seguinte parece "encontrar" o arquivo chamado .profile no 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, eu cd acima de um nível e tente novamente:
$ cd ..
$ pwd
/home
$ find .profile
find: .profile: No such file or directory
O comando find agora não pode encontrar nenhum caminho chamado .profile .
No entanto, se eu der uma olhada no diretório atual e, em seguida, restringir os nomes retornados a apenas .profile , ele também será encontrado lá:
$ pwd
/home
$ find . -name '.profile'
./kk/.profile