(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