{"id":83,"date":"2013-02-26T21:31:18","date_gmt":"2013-02-26T21:31:18","guid":{"rendered":"http:\/\/multimedia.uoc.edu\/blogs\/linux\/?p=83"},"modified":"2013-02-26T21:31:18","modified_gmt":"2013-02-26T21:31:18","slug":"busqueda-de-texto","status":"publish","type":"post","link":"http:\/\/multimedia.uoc.edu\/blogs\/linux\/busqueda-de-texto\/","title":{"rendered":"B\u00fasqueda de texto"},"content":{"rendered":"<p><\/p>\n<h3>No encuentro las cosas<\/h3>\n<p>Supongamos que queremos buscar un comando en nuestro sistema que se llama\u00a0<em>python<\/em> (en este caso es un int\u00e9rprete de python). Si conocemos su ubicaci\u00f3n exacta, en este caso\u00a0<em>\/usr\/bin<\/em>, es f\u00e1cil listar los ficheros que cumplen nuestras restricciones usando el comando\u00a0<em>ls<\/em>:<\/p>\n<pre>$ ls \/usr\/bin\/python*<\/pre>\n<p>El problema es que los comandos de Linux se pueden distribuir por muchos directorios distintos y a veces no sabemos exactamente d\u00f3nde est\u00e1n.<\/p>\n<h3>Find<\/h3>\n<p>El comando\u00a0<em>find<\/em>\u00a0es uno de los m\u00e1s importantes de Linux. Permite encontrar ficheros y directorios que encajan con una especificaci\u00f3n dada que puede incluir desde el nombre, hasta fechas de modificaci\u00f3n o los permisos que tiene asignados.<\/p>\n<p>De forma intuitiva, podemos especificar el uso de este comando de la siguiente forma:<\/p>\n<p align=\"center\"><em>find &lt;d\u00f3nde comenzar la b\u00fasqueda&gt; &lt;criterio de b\u00fasqueda&gt; &lt;acciones a realizar&gt;<\/em><\/p>\n<p>En el ejemplo anterior, podemos utilizar el comando\u00a0<em>find<\/em>\u00a0indicando que busque en todo el directorio \/usr de la siguiente forma:<\/p>\n<pre>$ find \/usr -name python* -print\r\n\/usr\/include\/python2.6\r\n\/usr\/share\/doc\/python-lockfile-0.8\r\n\/usr\/share\/doc\/python-markdown-2.0.1\r\n\/usr\/share\/doc\/m2crypto-0.20.2\/demo\/Zope\/lib\/python\r\n...<\/pre>\n<p>En el ejemplo vemos el uso t\u00edpico del comando. Primero indicamos que la b\u00fasqueda comience a partir del directorio \/usr. Autom\u00e1ticamente find buscara tambi\u00e9n en todos los subdirectorios contenidos en el mismo. Seguidamente le proporcionamos un criterio de b\u00fasqueda mediante el par\u00e1metro\u00a0<em>-name,<\/em>\u00a0que indica el nombre de los ficheros a buscar. Finalmente le especificamos que la acci\u00f3n a realizar es mostrar los resultados en pantalla mediante el par\u00e1metro\u00a0<em>-print<\/em>.<\/p>\n<p>El resultado que se muestra no s\u00f3lo nos indica los nombres de los comandos, sino tambi\u00e9n nos ofrece informaci\u00f3n sobre otros ficheros relacionados y entradas del manual.<\/p>\n<p style=\"padding-left: 30px;\">Aunque en muchas versiones modernas de find el par\u00e1metro\u00a0<em>-print<\/em>\u00a0se asume por defecto, es conveniente acostumbrarse a usarlo por si debemos trabajar con versiones m\u00e1s antiguas en las que podr\u00edamos no obtener ninguna salida por pantalla.<\/p>\n<h3>El tiempo es oro<\/h3>\n<p>El comando\u00a0<em>find<\/em>\u00a0permite realizar b\u00fasquedas teniendo en cuenta las fechas de acceso o modificaci\u00f3n de los ficheros, lo cual resulta muy \u00fatil para encontrar ficheros muy antiguos o los \u00faltimos en los que hemos realizado modificaciones, por ejemplo.<\/p>\n<p>El siguiente comando busca los ficheros de nuestro directorio que se han modificado entre la fecha actual y dos d\u00edas atr\u00e1s utilizando la opci\u00f3n\u00a0<em>-mtime<\/em>:<\/p>\n<pre>$ find \/home\/user -mtime -2 -print<\/pre>\n<p>Otras opciones disponibles son las siguientes:<\/p>\n<table width=\"100%\" border=\"0\">\n<tbody>\n<tr>\n<td width=\"12%\"><\/td>\n<td width=\"14%\">-atime n<\/td>\n<td width=\"90%\">Busca ficheros que tuvieron accesos hace n d\u00edas.<\/td>\n<\/tr>\n<tr>\n<td width=\"12%\"><\/td>\n<td width=\"14%\">-ctime n<\/td>\n<td width=\"90%\">Busca ficheros cuyos atributos (por ejemplo, permisos) se modificaron hace n d\u00edas.<\/td>\n<\/tr>\n<tr>\n<td width=\"12%\"><\/td>\n<td width=\"14%\">-amin n<\/td>\n<td width=\"90%\">Similar a -atime pero con accesos de hace n minutos.<\/td>\n<\/tr>\n<tr>\n<td width=\"12%\"><\/td>\n<td width=\"14%\">-cmin n<\/td>\n<td width=\"90%\">Similar a -ctime pero con modificaciones de hace n minutos.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>El tama\u00f1o importa y el tipo tambi\u00e9n.<\/h3>\n<p>En la actualidad, es muy f\u00e1cil llenar el disco duro instalando aplicaciones que ocupan grandes cantidades de espacio o bajando de Internet ficheros multimedia de tama\u00f1o elevado, por ejemplo. Por ello puede resultar \u00fatil poder encontrar ficheros que ocupan un cierto tama\u00f1o en el disco. La opci\u00f3n\u00a0<em>-size<\/em>\u00a0del comando\u00a0<em>find <\/em>permite realizar una b\u00fasqueda de este tipo. Tras dicha opci\u00f3n, debemos especificar el tama\u00f1o, por defecto en bloques de 512 bytes (0.5Kb), a\u00f1adiendo una <em>k<\/em>, en Kbytes o a\u00f1adiendo una <em>M<\/em> en Mbytes. Asimismo podemos indicar que queremos encontrar los ficheros con tama\u00f1o igual o mayor al indicado a\u00f1adiendo un `+&#8217;. Por ejemplo, el comando siguiente busca los ficheros mayores de 500 Kb en el directorio <em>\/usr\/bin<\/em>:<\/p>\n<pre>$ find \/usr\/bin -size +500k -print<\/pre>\n<p>Por otro lado, hasta ahora hemos dejado que <em>find<\/em> encuentre todo tipo de ficheros, incluyendo por ejemplo directorios. Pero es posible especificar con m\u00e1s detalle el tipo que queremos buscar con la opci\u00f3n &#8211;<em>type<\/em>, seguida de una letra, como vemos en el siguiente ejemplo en que restringe una b\u00fasqueda anterior \u00fanicamente a ficheros normales usando la letra &#8216;f&#8217;:<\/p>\n<pre>$ find\u00a0\/home\/user -mtime -2 -type f -print<\/pre>\n<p>Otras opciones ser\u00edan &#8216;d&#8217; para directorios o &#8216;l&#8217; para enlaces.<\/p>\n<h3>La hora de la ejecuci\u00f3n<\/h3>\n<p>Ya hemos visto la gran flexibilidad que proporciona\u00a0<em>find<\/em>\u00a0a la hora de establecer criterios de b\u00fasqueda. Seguidamente, veremos c\u00f3mo resulta una potente herramienta gracias a la posibilidad de ejecutar comandos sobre los resultados de la b\u00fasqueda.<\/p>\n<p>Imaginemos que queremos realizar una copia de todos los ficheros de nuestro directorio de trabajo modificados como mucho hace dos d\u00edas a un directorio de otro usuario llamado <em>prueba<\/em><em><\/em>. En el ejemplo anterior hemos visto que para encontrarlos podemos utilizar las opciones\u00a0<em>-mtime<\/em>\u00a0y\u00a0<em>-type<\/em>\u00a0del comando find. Pero \u00bfc\u00f3mo podemos especificar que queremos realizar una acci\u00f3n de copia sobre ellos? La soluci\u00f3n consiste en utilizar la opci\u00f3n\u00a0<em>-exec<\/em>\u00a0seguida del comando a ejecutar. En este caso el comando es <em>cp<\/em> y necesita saber el fichero a copiar y el destino. Este \u00faltimo es el directorio <em>\/home\/prueba<\/em>, pero no hay un s\u00f3lo fichero a copiar sino una lista de la cual no sabemos los nombres hasta ejecutar el comando. Para solucionar este \u00faltimo problema, podemos utilizar los s\u00edmbolos &#8216;{}&#8217;, que representan cada uno de los resultados proporcionados por <em>find<\/em>. As\u00ed, si escribimos &#8216;<em>cp {} \/home\/prueba<\/em>&#8216; significa &#8216;copia cada fichero resultante al directorio\u00a0<em>\/home\/prueba<\/em>&#8216;. Veamos la soluci\u00f3n final:<\/p>\n<pre>$ find \/home\/user -mtime -2 -type f -exec cp {} \/home\/prueba \\;<\/pre>\n<p>Las posibilidades de uso de esta opci\u00f3n son muy amplias siendo especialmente \u00fatil para automatizar tareas que se deben realizar sobre grupos de ficheros que cumplan ciertas caracter\u00edsticas.<\/p>\n<p style=\"padding-left: 30px;\">Prueba a utilizar la opci\u00f3n<em>\u00a0-exec\u00a0<\/em>con el comando\u00a0<em>rm<\/em>\u00a0para borrar los ficheros que has incluido en el directorio creado anteriormente. Ten cuidado, ya que puedes perder ficheros accidentalmente.<\/p>\n<p><\/p>","protected":false},"excerpt":{"rendered":"<p>No encuentro las cosas Supongamos que queremos buscar un comando en nuestro sistema que se llama\u00a0python (en este caso es un int\u00e9rprete de python). Si conocemos su ubicaci\u00f3n exacta, en este caso\u00a0\/usr\/bin, es f\u00e1cil listar los ficheros que cumplen nuestras restricciones usando el comando\u00a0ls: $ ls \/usr\/bin\/python* El problema es que los comandos de Linux &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/multimedia.uoc.edu\/blogs\/linux\/busqueda-de-texto\/\" class=\"more-link\">Seguir leyendo<span class=\"screen-reader-text\"> \u00abB\u00fasqueda de texto\u00bb<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-83","post","type-post","status-publish","format-standard","hentry","category-gnulinux","entry"],"_links":{"self":[{"href":"http:\/\/multimedia.uoc.edu\/blogs\/linux\/wp-json\/wp\/v2\/posts\/83","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/multimedia.uoc.edu\/blogs\/linux\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/multimedia.uoc.edu\/blogs\/linux\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/multimedia.uoc.edu\/blogs\/linux\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/multimedia.uoc.edu\/blogs\/linux\/wp-json\/wp\/v2\/comments?post=83"}],"version-history":[{"count":1,"href":"http:\/\/multimedia.uoc.edu\/blogs\/linux\/wp-json\/wp\/v2\/posts\/83\/revisions"}],"predecessor-version":[{"id":84,"href":"http:\/\/multimedia.uoc.edu\/blogs\/linux\/wp-json\/wp\/v2\/posts\/83\/revisions\/84"}],"wp:attachment":[{"href":"http:\/\/multimedia.uoc.edu\/blogs\/linux\/wp-json\/wp\/v2\/media?parent=83"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/multimedia.uoc.edu\/blogs\/linux\/wp-json\/wp\/v2\/categories?post=83"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/multimedia.uoc.edu\/blogs\/linux\/wp-json\/wp\/v2\/tags?post=83"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}