Cómo usar el comando de búsqueda en Linux
linuxfind
Los comandos son excelentes para buscar archivos y directorios. Pero también puede pasar los resultados de la búsqueda a otros programas para su posterior procesamiento. Te contamos cómo.
Comando de búsqueda de Linux
linuxfind
Los comandos son poderosos y flexibles. Puede buscar archivos y directorios utilizando una tonelada de criterios diferentes, no solo nombres de archivo. Por ejemplo, puede buscar archivos vacíos, archivos ejecutables o archivos propiedad de un usuario específico. Puede buscar y enumerar archivos por tiempo de acceso o modificación, puede usar patrones de expresiones regulares, es recursivo de forma predeterminada y funciona con pseudoarchivos como canalizaciones con nombre (búferes FIFO).
Todos estos son muy útiles.humildefind
El comando contiene algo de poder. Pero hay una manera de aprovechar ese poder y llevar las cosas a otro nivel.si podemos conseguirfind
la salida del comando y usarla automáticamente como entrada para otros comandos, podemos hacer algo para encontrar archivos y directorios que no se encontraron para nosotros.
El principio de canalizar la salida de un comando a otro es una característica central de los sistemas operativos derivados de Unix. El principio de diseño de hacer que un programa haga una cosa y la haga bien, con la expectativa de que su salida pueda ser la entrada de otro programa (incluso uno que aún no se haya escrito) a menudo se describe como la «filosofía de Unix». Sin embargo, algunas utilidades básicas comomkdir
) no acepta entrada canalizada.
Para solucionar esta deficiencia, elxargs
Los comandos se pueden usar para empaquetar entradas canalizadas y proporcionarlas a otros comandos como si fueran argumentos de línea de comandos para ese comando. Esto logra casi el mismo efecto que la tubería directa. Es algo «casi lo mismo», no «exactamente lo mismo», porque puede haber diferencias inesperadas en la expansión del shell y el englobamiento de nombres de archivo.
Usando find y xargs
nosotros podemos usarfind
conxargs
Realice alguna acción en los archivos encontrados. Este es un enfoque largo, pero podemos convertir los archivos encontradosfind
entrada axargs
y canalícelos entar
para crear un archivo de estos archivos. Ejecutaremos este comando en un directorio que contiene muchos archivos PAGE del sistema de ayuda.
buscar./ -nombre "*.página" -tipo f -print0 |xargs -0 tar -cvzf page_files.tar.gz
Los comandos se componen de diferentes elementos.
- Buscar./ -nombre «*.página» -tipo f -print0: La operación de búsqueda buscará archivos por nombre que coincidan con la cadena de búsqueda «*.page», comenzando desde el directorio actual.no listará directorios porque le dijimos específicamente que solo busque archivos, con
-type f
. Losprint0
el parámetro dicefind
No trate un espacio como el final de un nombre de archivo. Esto significa que los nombres de archivo con espacios en ellos se manejarán correctamente. - xargs-o:No trate los espacios en blanco como el final de un nombre de archivo
-0
parámetro.xargs
- tar -cvzf archivos_pagina.tar.gz:Esto es
xargs
Mover la lista de archivos defind
al comando proporcionado. La utilidad tar creará un archivo de almacenamiento llamado «page_files.tar.gz».
nosotros podemos usarls
Echa un vistazo al archivo creado para nosotros.
ls *.gz
Los archivos de archivo se crean para nosotros. Para hacer esto, todos los nombres de archivo deben pasarse juntos atar
en masa, esto es lo que pasó. Todos los nombres de archivo se tokenizan al final del comando,tar
como una línea de comando muy larga.
Puede elegir que el comando final se ejecute en todos los nombres de archivo a la vez o que se llame una vez por nombre de archivo.xargs
Al canalizar la salida a una utilidad de conteo de líneas y caracteres,Fácilmente podemos ver la diferencia.wc
.
este comandowc
Canalice todos los nombres de archivo a la vez. De hecho, porCada nombre de archivo enxargs
Construya una línea de comando larga.wc
Buscar.-nombre "*.página" -tipo f -print0 |xargs -0 wc
Imprima las líneas, palabras y caracteres de cada archivo y el total de todos los archivos.
si usamosxarg
‘s-I
(cadena de reemplazo) y defina un token de cadena de reemplazo, en este caso «{}
«: este token se reemplaza por cada nombre de archivo en el comando final.esto significawc
Llamado repetidamente, una vez para cada archivo.
Buscar.-nombre "*.página" -tipo f -print0 |xargs -0 -I "{}" wc "{}"
La salida no se alinea bien.cada llamadawc
opera en un solo archivo, por lo quewc
No se puede alinear nada con la salida. Cada línea de salida es una línea de texto separada.
porquewc
Operar varios archivos a la vez solo proporciona una suma, por lo que no obtenemos estadísticas de resumen.
encontrar la opción -exec
Deberíafind
El comando tiene un método incorporado para llamar a un programa externo para realizar un procesamiento adicional en el nombre de archivo que devuelve.(-exec
ejecutar) tiene una sintaxis similar pero diferente dexargs
Ordenar.
Buscar.-nombre "*.página" -tipo f -exec wc -c "{}";
Esto contará las palabras coincidentes en el archivo. Los comandos constan de estos elementos.
- Buscar.: Comience a buscar en el directorio actual. Por defecto el
find
El comando es recursivo, por lo que también se buscan subdirectorios. - -nombre «*.página»: Estamos buscando archivos cuyos nombres coincidan con la cadena de búsqueda «*.page».
- – tipo f: Solo buscamos archivos, no directorios.
- -baño ejecutivo: Lo haremos
wc
Los nombres de archivo que coincidan con la cadena de búsqueda ejecutan el comando. - -w: Cualquier opción que se pase al comando debe seguir inmediatamente al comando.
- «{}»: Los marcadores de posición «{}» representan cada nombre de archivo y deben ser el último elemento en la lista de parámetros.
- ;: un punto y coma «;»Se utiliza para indicar el final de una lista de argumentos. Debe escaparse con una barra invertida «» para que el shell no lo interprete.
Cuando ejecutamos ese comando, vemoswc
.-c
(recuento de bytes) limita su salida al número de bytes en cada archivo.
Como puede ver, no hay un total. Deberíawc
El comando se ejecuta una vez para cada nombre de archivo. Usando el signo más «+
«en lugar de terminar punto y coma»;
”, podemos poner el-exec
cambió el comportamiento para operar en todos los archivos a la vez.
Buscar.-nombre "*.página" -tipo f -exec wc -c "{}" +
Obtenemos resultados de listados totales y ordenados que nos dicen que todos los archivos estánwc
nos pasó como una larga línea de comando.
ejecutivo realmente significa ejecutivo
(-exec
ejecutar) no inicia el comando ejecutándolo en el shell actual. Utiliza el sistema integrado de Linux ejecutar comando ejecutivo, reemplazando el proceso actual (su shell) con el comando. Por lo tanto, el comando lanzado no se ejecuta en absoluto en el shell. Sin un shell, no obtiene la expansión de shell de comodines, ni acceso a alias y funciones de shell.
Esta computadora define una función de shell llamadawords-only
. Esto solo cuenta las palabras en el archivo.
función solo palabras () { wc -w $1}
Quizás una característica extraña, «solo palabras» es mucho más largo de escribir que «wc -w», pero al menos significa que no necesita recordarwc
. Podemos probar que funciona así:
texto sin formato user_commands.pages
Esto funciona bien para llamadas de línea de comandos normales. Si tratamos de usarfind
de-exec
opción llama a la función, fallará.
Buscar.-name "*.page" -type f -exec solo palabras "{}";
find
El comando no puede encontrar la función de shell,acción-exec
fallar.
Para superar este problema, podemosfind
Inicie un shell Bash y pásele el resto de la línea de comando como argumentos. Necesitamos encerrar la línea de comando entre comillas dobles.{}
Esto significa que necesitamos escapar de la cadena de reemplazo » «comillas dobles circundantes.
cuando corremosfind
Antes del comando, necesitamos usar-f
(como función) opción para exportar nuestra función de shell:
exportar -f solo palabra
Buscar.-name "*.page" -type f -exec bash -c "solo palabras "{}"""";
Esto funciona como se esperaba.
uso múltiple de nombre de archivo
Si desea encadenar varios comandos, puede hacerlo