Consultas, desarrollo de programas y petición de presupuestos:

jueves, 12 de julio de 2012

pwd, find y grep

Pautas que siguen los comandos: Los resultados
  • Los programas tienen que no den más mensajes de los necesarios, para que se pueden usar en otros comandos, y generar la salida mínima (no mensajes de terminación de programas, felicitaciones, etc..)

Comandos:
pwd: te dice el nombre del directorio actual. En un script de bash/shell, te puede interesar saber donde estas tu trabajando (en que directorio esta en ese momento), en C lo puedes averiguar.

Find: te permite encontrar archivos y hacer cosas con ellos.
Formas de usar: find lugar_donde_se_busca archivo_buscado accion
lugar_donde_se_busca: es un directorio
archivo_buscado: permite buscar con distinto criterios de busqueda, ejemplo:
-name nombre_del_archivo
-user usuario al que pertenece ese archivo
-group grupo al que pertenece ese archivo
-mtime nº de dias que hace que se modifico ese archivo
-size tamaño del archivo y se le puede indicar el parametro : b,c,k,w
b=bloques de 512 bytes (es la que se usa por defecto)
c= 1 byte (1 caracter)
k= 1 kbyte (1024 byte) (mas util)
w= 2 bytes (palabra, sin mucha utilidad)
En todos los valores numericos se pueden indicar el
numero = indicamos exactamente ese numero
-numero = menor a ese numero
+numero = mayor que ese numero

La accion: lo que se va a hacer con los ficheros que cumplan los criterios de busqueda.
La accion habitual es -print que imprime el nombre de los archivos. (es el valor por defecto, si no lo pones te lo muestra)
Otra opcion: -exec comando, que ejecutaria un comando cuando encuentra algo

Ejemplos:

$find ~ -name “*.c” -print

busca en el directorio /home/usuario (y tambien busca en los subdirectorios) los archivos que cumplan con el nombre “*.c “, y los imprima en pantalla

$find / -name “stdio.h” -print

Busca en el directorio raiz (y todos sus subdirectorios) el archivo stdio.h, y lo imprime en pantalla. Aparecen un monton de errores de “find: <<directorio>>:permiso denegado”
¿como se puede solucionar?
$find / -name “stdio.h” 2>/dev/null -print
2>/dev/null: redireccion de error standr. (stderr)


Find ~ -mtime +3 -name “*.c”
Buscara archivos de mas de 3 dias de antigüedad y cuyo nombre sea “*.c”

$Find ~ -mtime +3 -name “*.c” -mtime -6
Buscara archivos en el intervalo de mas de 3 dias y menos de 6 de antigüedad y cuyo nombre sea “*.c” (buscara en el intervalo de 3.00.01 a 5.59.59)

Nota: he encontrado esta web, donde viene muy detallado el comando find:

grep: busca texto en uno o varios archivos, y te muetra la linea donde lo encuentra (coloreando el texto)
gred opciones texto_a_buscar archivos_sobre _los_que_trabaja

Ejemplo:
$grep “main” fichero.c
muestra la/s linea/s donde aparece escrita la palabra “main” en el fichero “fichero.c”

$grep “int “ fichero.c
Busca todas las variables definidas con integer en el programa fichero.c. Fijaos que pongo espacio en blanco despuede de int, si no tambien mostraria print(

Opciones que tiene grep:
-v: te muestra lo contrario, (las lineas que no contienen ese texto)
-c: te cuenta el numero de linea donde han aparecido o no han aparecido (-v)
-n: te muestra el numero de linea del archivo original donde aparece el texto buscado ( o no ha aparecido -v)
-y ó -i : no distinque entre mayusculas y minusculas.

Los comando find y grep, son muy utiles, mezclandolos entre si:

$find ~ -name "*.c" | xargs grep "int " -n
(uso de tuberías: busca todos los archivos con nombre “*.c”, y con la tuberia la salida de find, busca la palabra “int “, y enumera la linea de donde esta en cada archivo.


Otro ejemplo:
find ~ -name “*.c” -exec grep -i -l “int “ {} \;
(sin uso de tuberia y usando -exec)
-l: nombre del archivo
-i: = -y
{} = donde se va a utilizar el nombre que ha coincidido, find los mete en el, para que grep los compruebe
\; indicar que he terminado la orden que voy a ejecutar (-exec)
Muestra el nombre del archivo que cumple: “*.c” y que contenga “int”

Nota importante para el alumno y el uso de los apuntes:
Comillas " y comillas cursiva “
Cuando copiamos el código de algún programa o linea de comandos, y la pegamos en una terminal (por ejemplo), el navegador copia las comillas " como comillas cursivas “, con lo cual da error al ejecutar la linea. Para solucionar este error solo hay que sustituir las comillas cursivas por las comillas ".

No hay comentarios:

Publicar un comentario en la entrada