(Estou assumindo o GNU find
aqui)
Usando apenas
find filename
seria rápido, porque retornaria apenas filename
, ou os nomes dentro, filename
se 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 filename
for um diretório).
Em contraste,
find | grep filename
permitiria find
gerar uma lista de todos os nomes do diretório atual e abaixo, que grep
seriam 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 filename
o 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 grep
solução corresponderia filename
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.
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 find
para listar todos os nomes disponíveis sob as três caminhos a
, b
e 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 filename
uso -name 'filename'
. A string filename
pode ser um padrão globbing de nome de arquivo, como *.txt
(lembre-se de citá-la!).
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 cd
subo um nível e tente novamente:
$ cd ..
$ pwd
/home
$ find .profile
find: .profile: No such file or directory
O find
comando 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