domingo, 30 de marzo de 2014

Buscar Archivos en linux/unix (Find)

Bueno ahora toco un tema bien divertido jeje buscar archivos en linux o bien Unix,
como ya muchos saben buscar un archivo aveces no es tan complejo otras veces es un verdadero dolor de cabeza pero para esto contamos con el comando find.

conforme encuentra mas busquedas las ire agregando en el post y les dare mas trucos para depurar sus resultados por ahora veremos lo basico.

find es un comando sumamente poderoso por que su utilidad no termina en solo buscar sino que ademas puede ejecutar y hacer excepciónes para desplegar una selección de resultados sumamente especifica.

Busquedas de ejemplo
(donde el punto "." significa el directorio actual y puede ser sustituido por otro path)

find . -name “miarchivo.txt”  
find . -name “java” buscar archivos  que empiezen con la palabra java

find . -name "*.java" busca archivos que terminen con la palabra .java

find . -perm 777  busca los archivos que tengan permisos 777

find . -mtime +1 encuentra los archivos modificados hace mas de un día.

find . -mtime -1 encuentra los archivos modificados hace menos de un día.

find . –name "*.txt" –print | xargs grep "test" 
busca la palabra "test" en todos los archivos que devuelva la busqueda de los archivos que terminene con extención *.txt (personalmente este es muy util)

find . -iname "archivo"
con iname es para hacer la busqueda case sensitive, de modo que no distinge entre mayusculas y minusculas.




---encuentra archivos entre la fecha del primer archivo y como maximo la fecha del segudo archivo y a los archivos encontrados los comprime con gzip

find . -name "*" -newer /home/miarchivo.log ! -newer /home/miarchivo_nuevo.log | xargs -I {} gzip {} 


 --- para saltarse un path, si la condicion es true, no entra en el folder
find / -path /mipath/Backup -prune -o -name domain.xml -print     //local para solaris


--- Find para determinar el tamaño de todos los directorios del sistema (usar con cuidado)
para solaris
find ./ -type d -depth  -exec du -sh {} + | sort -n

para linux
find ./ -type d -maxdepth 3 -exec du -sh {} + | sort -n


<<<< busca varios archivos y modifica en todos los archivos una linea >>>>
find . -name "test_file*" -exec perl -pi -e 's/cadenaen_a_remplazar/nueva_cadena/g' {} \;

(este comando puede variar, en linux podemos usar la opcion sed -i, pero para solaris no me tomaba el valor -i asi que pearl en modo interactivo es bastante eficiente)



Manejo basico de jobs en linux/solaris

Saludos apoco no les ha pasado que quieren ejecutar un shell en segundo plano y resula que ya lo lanzaron o por ejemplo despliega muchas letras engorrosas en la terminal y demas cosillas que a los principiantes sysadmins o noobsters nos llega a suceder, bueno aqui un pequeño tutorial.

es comun ejecutar scripts en bash y pearl en la terminal Linux para eso nos ayudamos de ./nombredelscript.sh o pl etc...
pero que pasa cuando lo queremos mandar a segundo plano, basicamente disponemos de 2 opciones

./nombredetushell. & 

colocar al final el simbolo de " & " manda a segundo plano el comando o script que se desea ejecutar
si queremos evitar que nos lance letras o la salida del comando en la terminal podemos agregar:

nohup ./nombredetushell &

con esto ya no veremos salida en la termina y se ira a segundo plano, pero que pasa cuando queremos ver si sigue en ejecución por que este aun no termina.

podemos usar el comando jobs y con este comando seremos capaz de visualizar una lista de los jobs que se estan ejecutando con un numerito [num] que indica la prioridad con la que se ejecuta el job

[1]   running                 /opt/apache/test.sh
[2]+  running                /tmp/shell2.sh > /dev/null


ahora bien supongamos que lo queremos traer a primer plano podemos dar el comando fg para regresar un comando que enviamos a segundo plano a primer plano, de igual forma para enviar el comando nuevamente a segundo plano o bien cualquier otro comando que este en ejecución en primer plano podemos ejecutar ctrl+z para detenerlo y luego el comando bg, al mandarlo a segundo plano en algunas versiones de linux nos regresa el numero de job y el PID vemos un ejemplo:

digamos que yo arranco un shell para ordenar mis mp3 llamado mp3sort.sh

y lo lanzo con ./mp3sort.sh hasta este punto lanzamos la ejecucion pero como tenemos mas cosas que hacer en la terminal y nos es una prioridad, lo mandamos a segundo plano ejecutamos ctrl+z para detenerlo y luego el comando bg .

[2] 2136   

jobs

[1]  done                     ./e.sh
[2]  running                ./mp3sort.sh

Mas tarde nos acordamos que dejamos un shell corriendo y queremos ver en que estatus quedo entonces tecleamos el comando jobs

[1]  running                ./mp3sort.sh


y vemos que sigue en ejecución, entonces nos damos cuenta de que ya lleva mucho tiempo y no funciona o estaba en prueba, entonces lo queremos matar aqui hay de 2 le damos un kill -9 y el pid
en este caso kill -9 2136 para matar el job o bien kill %1 que es el número de job.

entonces ya disponemos de varias opciones para iniciar el job y mandarlo a segundo plano desde un inicio o bien detenerlo y mandarlo a background mode (segundo plano)

haber ahi les va un ejemplo mas complicado


<<<<<<<<<<<<< Matar varios procesos y tareas especificas >>>>>>>>>>>>>>>
ps -fea |grep root| egrep -v "license|samba" | awk '{print $2}' | xargs -I {} kill -9 {}

vamos a desglozar el comando de mas arriba, recuerda que  " | " es una tuberia y redirige la salida del primer comando al seguiente, quiza no es el modo mas elegante de hacerlo, pero es un buen ejemplo de tuberias ;-), vamos!!
sacamos todos los procesos (ps -fea), depuramos con grep al usuario root y con egrep buscamos las palabras que contengan smbd y samba, con awk solo dejamos el PID del proceso, con xargs cachamos la lista  de procesos y la ponemos en un array{} y a todos esos PID les damos un kill -9 {}
las llaves es para indicar el array :-)

algo mas elegante es utilizar el comando pgrep -u myusuario o bien el pkill -u myusuario, tanto pgrep como pkill tienen varias opciones mas para buscar procesos o matarlos.

a la espera de sus comentarios y espero les sirva.