Suponiendo que se debe usar la herramienta grep, me gustaría buscar la cadena de texto "800x600" en todo el sistema de archivos.
Lo intenté:
grep -r 800x600 /
Pero no funciona.
Lo que creo que mi comando debería hacer es grep recursivamente a través de todos los archivos / carpetas en la raíz para el texto "800x600" y enumerar los resultados de la búsqueda.
¿Qué estoy haciendo mal?
Permission denied
errores? ¿Lo ejecutaste como root o como un usuario normal?grep -r 800x600 / 2>/dev/null
. También puedes intentar ejecutarlo como root.Respuestas:
Normalmente uso este estilo de comando para ejecutar
grep
varios archivos:Lo que esto realmente hace es hacer una lista de cada archivo en el sistema, y luego para cada archivo, ejecutar
grep
con los argumentos dados y el nombre de cada archivo.El
-xdev
argumento dice encontrar que debe ignorar otros sistemas de archivos; esto es bueno para evitar sistemas de archivos especiales como/proc
. Sin embargo, también ignorará los sistemas de archivos normales, por lo que si, por ejemplo, su carpeta / home está en una partición diferente, no se buscará, debería decirfind / /home -xdev ...
.-type f
significa buscar solo archivos, por lo que se ignoran los directorios, dispositivos y otros archivos especiales (aún se repetirá en los directorios y se ejecutarágrep
en los archivos internos; simplemente no se ejecutarágrep
en el directorio en sí, lo que no funcionaría de todos modos). Y la-H
opcióngrep
le dice que siempre imprima el nombre del archivo en su salida.find
acepta todo tipo de opciones para filtrar la lista de archivos. Por ejemplo,-name '*.txt'
procesa solo archivos que terminan en .txt.-size -2M
significa archivos que son más pequeños que 2 megabytes.-mtime -5
significa archivos modificados en los últimos cinco días. Une estos con -a for y y -o for or , y usa'('
paréntesis')'
para agrupar expresiones (entre comillas para evitar que el shell las interprete). Así por ejemplo:Echa un vistazo
man find
para ver la lista completa de posibles filtros.fuente
-xdev
excluirá todos los demás sistemas de archivos, no solo los especiales. (por ejemplo, si ha/home
montado como una partición separada, no se buscará).find: paths must precede expression: /
xargs
con tal vez una mejor eficiencia al hacerlofind / -xdev -type f -exec grep -H '800x600' +
.+
signo al final delfind
comando en realidad hace lo mismo quexargs
: genera ungrep
proceso con varios argumentos.Normalmente no querrás buscar TODO en el sistema. Linux utiliza nodos de archivo para todo, por lo que algunos "archivos" no son cosas que desea buscar. Por ejemplo,
/dev/sda
es el dispositivo de bloque físico para su primer disco duro. Probablemente desee buscar en los sistemas de archivos montados, no en el dispositivo de disco sin formato. También existe la/dev/random
que escupe datos aleatorios cada vez que los lee. Buscar eso no tiene mucho sentido. El/proc
sistema de archivos también es problemático en su caso.Recomendaría una de dos cosas.
No busque en la raíz, solo busque los lugares que podrían ser útiles. Buscar
/home
o/usr
o/etc
separadamente. La información que está buscando es probable que sea de un tipo específico, por lo que es probable que esté en una carpeta específica de todos modos. Los ajustes de configuración deben estar en/etc
. Sus archivos de datos personales deben estar en/home
. Limitar la búsqueda a un área importante como esta reducirá en gran medida sus problemas con greps recursivos.Excluya el uso de áreas problemáticas
--exclude-dir
y un conjunto de cosas que sabe que no necesita de esta manera:grep -r --exclude-dir /proc --exclude-dir /dev --exclude-dir /tmp --exclude-dir /lost+found
Por último, no es raro encontrarse con algunos errores de "permiso denegado" cuando se hace una gran grep recursiva. En el curso normal de uso, hay archivos que su usuario no podrá leer. Siempre que estos sean solo algunos archivos extraños y no cosas como el dispositivo sin formato para sus discos duros o todo el sistema de archivos de proceso, está bien simplemente ignorar los errores. De hecho, puede hacer esto en la línea de comando enviando todos los errores a nunca nunca aterrizar:
fuente
-I
para excluir binarioPor simplicidad, sugeriría ack-grep . El enlace muestra muchos casos cuando
ack-grep
es una mejor opción.Para usar es, después de la instalación:
fuente
Otra forma de verlo es de esta manera:
fuente
* entonces obtengo un / proc / sysrq-trigger: error de entrada / salida
Su comando está funcionando, está recibiendo este error porque está tratando de escanear procesos en ejecución en busca de una cadena.
Recomiendo excluir directorios del sistema con
grep -exclude-dir = {proc, sys} "800x600" /
fuente
simplemente correcto
-Lo que está mal en su comando actual son las comillas, "". Siempre ponga el argumento de cadena
grep
entre comillas.fuente
grep
. Pruébalo y verás. Coloque la cadena "800x600" en un archivo y luegogrep 800x600 file
verá que funciona bien. El OP obviamente tiene otro problema.