(Estoy asumiendo GNU find
aquí)
Usando solo
find filename
sería rápido, porque simplemente regresaría filename
, o los nombres dentro filename
si 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 filename
es un directorio).
A diferencia de,
find | grep filename
permitiría find
generar una lista de todos los nombres del directorio actual y debajo, que grep
luego 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 filename
como 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 grep
solución coincidiría filename
con 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 find
funciona.
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 find
enumerar cada nombre disponible bajo las tres rutas a
, b
y 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 filename
uso -name 'filename'
. La cadena filename
puede ser un patrón global de nombre de archivo, como *.txt
(¡solo recuerde citarlo!).
Ejemplo:
Lo siguiente parece "encontrar" el archivo llamado .profile
en 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 cd
subo un nivel e intento nuevamente:
$ cd ..
$ pwd
/home
$ find .profile
find: .profile: No such file or directory
El find
comando 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