(Estoy asumiendo GNU findaquí)
Usando solo
find filename
sería rápido, porque simplemente regresaría filename, o los nombres dentro filenamesi es un directorio, o un error si ese nombre no existiera en el directorio actual. Es una operación muy rápida, similar a ls filename(pero recursiva si filenamees un directorio).
A diferencia de,
find | grep filename
permitiría findgenerar una lista de todos los nombres del directorio actual y debajo, que grepluego se filtraría. Obviamente, esta sería una operación mucho más lenta.
Supongo que lo que realmente se pretendía era
find . -type f -name 'filename'
Esto buscaría filenamecomo el nombre de un archivo normal en cualquier parte del directorio actual o debajo.
Esto será tan rápido (o comparativamente rápido) como find | grep filename, pero la grepsolución coincidiría filenamecon la ruta completa de cada nombre encontrado, de manera similar a lo -path '*filename*'que haría con find.
La confusión proviene de un malentendido de cómo findfunciona.
La utilidad toma varias rutas y devuelve todos los nombres debajo de estas rutas.
Luego, puede restringir los nombres devueltos utilizando varias pruebas que pueden actuar sobre el nombre del archivo, la ruta, la marca de tiempo, el tamaño del archivo, el tipo de archivo, etc.
Cuando tu dices
find a b c
solicita findenumerar cada nombre disponible bajo las tres rutas a, by c. Si se trata de nombres de archivos normales en el directorio actual, se devolverán. Si alguno de ellos es el nombre de un directorio, se devolverá junto con todos los demás nombres dentro de ese directorio.
Cuando lo hago
find . -type f -name 'filename'
Esto genera una lista de todos los nombres en el directorio actual ( .) y debajo. Luego, restringe los nombres a los de los archivos normales, es decir, no a directorios, etc., con -type f. Luego hay una restricción adicional a los nombres que coinciden con el filenameuso -name 'filename'. La cadena filenamepuede ser un patrón global de nombre de archivo, como *.txt(¡solo recuerde citarlo!).
Ejemplo:
Lo siguiente parece "encontrar" el archivo llamado .profileen mi directorio de inicio:
$ pwd
/home/kk
$ find .profile
.profile
Pero, de hecho, solo devuelve todos los nombres en la ruta .profile(solo hay un nombre, y ese es el de este archivo).
Luego cdsubo un nivel e intento nuevamente:
$ cd ..
$ pwd
/home
$ find .profile
find: .profile: No such file or directory
El findcomando ahora no puede encontrar ninguna ruta llamada .profile.
Sin embargo, si consigo que mire el directorio actual, y luego restrinja los nombres devueltos a solo.profile , también lo encuentra desde allí:
$ pwd
/home
$ find . -name '.profile'
./kk/.profile