“¿Cómo encontrar cosas en Linux?", “¿Cómo buscar en Linux?", entre otras preguntas, son las que naturalmente nos formularemos tarde o temprano. Sin más preambulos, comencemos a estudiar el comando find.
Primero, lo primero; debes leerte el man page de find.
Bajo circunstancias normales, de haber sido un man page corto, o de tamaño moderado; ciertamente lo hubiese traducido. Pero el tamaño de ese documento dificulta las cosas.
1. Lo básico:
Si ejecutas find sin pasarle ningún paramentro, intentará encontrar todos los directorios y subdirectorios, ficheros, etc., a partir del lugar donde lo ejecutes.
Evidentemente, ejecutarlo sin pasarle parametros no tendría ninguna utilidad, de modo que el primer parametro que deberiamos pasarle, debe ser la ruta donde se ejecutará la busqueda, y el segundo parametro, el nombre del fichero que queremos buscar.
e.g, Digamos que quiero buscar un fichero llamado pepito.txt , en mi directorio HOME, haría algo como lo siguiente:
# find /home/jespinal/ -name "pepito.txt"
donde /home/jespinal es el nombre de mi directorio HOME, y pepito.txt es el nombre del fichero, el cual encerramos en comillas (""), esto no es realmente obligatorio (a menos que uses caracteres comodines como ‘*’ o ‘?’, los cuales podrian ser interpretados por la consola como una ruta en donde buscar en vez de algo que forma parte del nombre), pero es buena practica porque te permite buscar nombres con espacios de por medio, ej. ‘mi lista.txt’
2. Avanzando un poco
Puede darse el caso donde no sabemos exactamente el nombre del fichero, sino que sabemos que dicho nombre comenzaba con ‘pep’; y no solo eso, sino que tampoco sabemos donde esta ubicado exactamente.
Sencillo, sin importar donde este, obviamente estara en un subdirectorio en algun lugar debajo de nuestro directorio raiz ( / ), asi que empezaremos la busqueda desde ahi. Y ya que no sabemos el nombre exacto del fichero, le daremos a find lo que tenemos (A final de cuentas, quien debe buscar es el, no nosotros :] )
e.g Escribiriamos algo como lo siguiente:
# find / -name "*pep*"
y listo.
Como nota adicional, fijate que delante de ‘pep’ (que eran los unicos caracteres que inicialmente sabiamos que estaban contenidos en el nombre del fichero) he puesto un asterisco ( * ), tambien detras.
El asterisco basicamente significa ‘cualquier cosa’, o ‘cualquier combinacion de texto’.
Estamos diciendole a find que busque, a partir de / (root), algo (ya sea fichero o directorio) cuyo nombre comience con ‘cualquier cosa’ seguida de los caracteres ‘pep’, y que termine con ‘cualquier cosa’.
Dentro de los posibles valores que puede valer el asterisco, esta la posibilidad de que no haya ningun caracter; o sea, si aparece un fichero (o directorio) llamado pepsi.txt, sipep.txt, pep.txt, sopepto.txt, entonces find te lo dira, ya que todos coinciden con el parametro de busqueda que diste para el nombre.
3. Ser mas exigente con la busqueda
Recuerda que find va a buscar lo que le digas que busque, de acuerdo a la manera que se lo digas, y será tan preciso en los resultados como tu lo seas en los parámetros que le pasas.
Si le pasas parámetros poco precisos, no esperes que find te traiga solo resultados de lo que tu estabas esperando.
Imagina que quieres ver los ficheros regulares que tienes en tu directorio HOME.
OJO: dije ficheros regulares, no directorios, no symbolic links (vinculos simbolicos), ni tampoco pipes, FICHEROS!
Para eso solo tienes que indicarle a find el tipo, que es ‘f’,
La tabla de posibles tipos de ficheros es la siguiente:
b bloque especial
c caracter especial
d direcotorio
p tuberia (pipe)
f fichero regular
l vínculo simbolico (leete el man page para que veas unas cuantas especificaciones)
s socket
D Puerta (Solaris)
Para el ejemplo previo, tendríamos que ejecutar algo como esto:
# find /home/jespinal -type f
4. Algunos ejemplos prácticos
a. Buscar a partir del directorio raiz todos los ficheros regulares cuyo nombre termine en .log
# find / -type f -name "*.log"
b. Buscar a partir del directorio raíz todos los ficheros terminados en .tmp y eliminarlos
# find / -type f -name "*.tmp" -delete
Ojo: la opción -delete sirve para eliminar los ficheros que find encuentra a partir de los parametros que le damos (cuidado, cualquier error puede ser letal).
c. Encontrar en el directorio actual ( . ) los ficheros regulares, y copiarlos a /tmp
# find . -type f -exec cp '{}' /tmp \;
Ojo: No te asustes, ahora te explico.
Cuando find encuentra un fichero, su nombre es sustituido por los carácteres ‘{}’, de modo que cuando hacemos el ‘cp {} /tmp’ , es lo mismo que si hicieramos (uno por uno) un ‘cp fichero.txt /tmp’ o ‘cp fichero_regular.zip /tmp’, etc, etc.
Otro dato muy importante, es que para poder ejecutar alguna orden utilizando los nombres de los ficheros que find encuentra, necesitas utilizar -exec.
Los comandos que se pasan a find, utilizando -exec deben ser terminados con un ‘;’.
En el ejemplo previo viste que utilice \; para poder ‘escapar’ ese caracter. Ya que las ordenes que le damos a nuestro sistema mediante la consola son separados por ‘;’ tambien, debemos hacer que la consola ignore el ‘;’ y se lo pase a find
Ej. si ejecutamos
# clear; cd /tmp; ls
estos comandos serán ejecutados uno a continuación del otro, en el orden que los escribiste, separados por ‘;’ por nuestro sistema. Al utilizar \; , entonces la consola no lo interpreta y se lo envia directamente a find.
(Si esta parte no te quedo muy clara, escribeme, y asi la aclaro mejor)
d. Encontrar en el directorio actual los ficheros (de cualquier tipo) que tengan permisos 644
# find . -perm 664
e. Encontrar en el directorio /usr/src los archivos cuyo nombre terminen en .c (codigo fuente) y cuyo tamaño sea mayor a 100k, e imprimirlos (en pantalla).
# find /usr/src -name '*.c' -size +100k -print
Fijate que nuevamente utilice el caracter comodin ( * ) dentro de comillas, para evitar que el shell lo expanda (interprete).
Es conveniente que se den una ojeada al man page de ‘find’; poco a poco ire agregando mas ejemplos practicos a esta lista. (Si te interesa saber como hacer algo con find, enviame un msg).
-- Jose P. Espinal http://www.eslackware.com

Definitivamente, luego de haber entrado en el mundo de Slackware Linux, Los ‘man pages’ (páginas de manual) y Google serán tus mejores amigos; y más que eso, tu Shaman y tu Guía, respectivamente.
Relmente no tenía tiempo para escribir hoy, estoy algo atareado por cuestiones laborales, y me senté un rato en mi PC a descansar, hasta que de pronto… ‘tucutú’ , el horrible sonidito de aMSN indicando que alguien me ha hablado.
Sin mucho ánimo, muevo mi brazo hasta alcanzar el mouse, le doy click a la … ventanita esta!, pensando que es algo importante (puesto que mi estado esta en ‘away’) y de pronto: alguien preguntandome algo que estoy ultra seguro que Google en su inmensa sabiduría ha respondido ya de muchas maneras.
Mi respuesta fue simple:
RTFM! (Read The F—-ng Manual) , lo cual no me ayudo mucho, pero me desahogó…
En esta ocasion vamos a tratar de entender unos cuantos tips de nuestro gran amigo ‘man’ (manual).
Si escribimos en consola:
# man man
Estaremos llamando el manual del manual pages, el cual muestra algo como esto:
NOMBRE
man - formatea y despliega las paginas online del manual
SINOPSIS
man [-acdfFhkKtwW] [--path] [-m system] [-p texto]
[-C config_file] [-M pathlist] [-P pager] [-B navegador]
[-H htmlpager] [-S section_list] [section] nombre ...
DESCRIPCIÓN
man formatea y despliega las paginas online del manual. si
le especificas la sección, man unicamente buscará en esa
sección del manual.
nombre , normalmente es el nombre de la página
del manual, la cual es típicamente el nombre del comando,
función, o archivo. Sin embargo, si el nombre contiene una
barra (slash, '/'), entonces man lo interpretara como la
especificacion de un archivo,
de modo que puedes hacer:
man ./foo.5 o incluso man /cd/foo/bar.1.gz.
Entre otras cosas…
1. Todos los parametros que esten incluidos en llaves, indican que son opcionales, y no es explicitamente necesario indicar uno o más de ellos. Ej.
[-acdfFhkKtwW] [--path] [-m system]
me parece que esa sintaxis es un estandar de documentación, puesto que incluso la documentación de muchas otras cosas usan este formato. (ej. PHP, PERL, C, etc. etc.)
2. Los parametros que no aparezcan dentro de llaves, son obligatorios. Ej.
nombre
3. Una sinopsis es una definicion resumida y generalizada acerca de algo, los detalles de todos los parametros opcionales y obligatorios, son descritos mas abajo, de modo que tendras que desplazarte a travez de toda la pagina del manual para poder entender cierta documentacion.
4. Los manuales siempre hacen refencia a otras paginas de manual, diciendo algo como:
SEE ALSO
apropos(1), whatis(1), less(1), groff(1), man.conf(5).
En este caso (y muy pertinentemente, hacen referencia a la pagina numero (1) del comando ‘apropos’, el cual es bastante util buscando en diferentes paginas de manual.
5. Cuando veas algo como man.conf(5), quiere decir que debes buscar en la pagina (5), del manual:
man 5 man.conf
6. Para saber cuales paginas de manual hablan acerca de cierto termino, usamos ‘apropos’, ej:
apropos ssh
nos desplegara (entre otras cosas) algo como esto:
hfssh (1) - Tcl interpreter with HFS extensions ssh (1) - OpenSSH SSH client (remote login program) ssh-add (1) - adds RSA or DSA identities to the authentication agent ssh-agent (1) - authentication agent ssh-copy-id (1) - install your identity.pub in a remote machine's authorized_keys ssh-keygen (1) - authentication key generation, management and conversion ssh-keyscan (1) - gather ssh public keys ssh-keysign (8) - ssh helper program for host-based authentication ssh_config (5) - OpenSSH SSH client configuration files sshd (8) - OpenSSH SSH daemon sshd_config (5) - OpenSSH SSH daemon configuration file
indicando el nombre y numero de la pagina de manual que hace referencia al termino que estuvimos buscando, para visualizar, hacemos igual que como hicimos anteriormente:
# man 5 ssh_config # man 8 sshd # man 1 ssh-keygen
7. Si no te gusta leer man pages en consola, puedes abrir konqueror y poner algo como esto en la barra de direcciones:
man:/cp
Para ver el manual del comando cp , por ejemplo, y asi sucesivamente.
8. Es cierto que no es lo mas sencillo del mundo entender man pages, pero tambien es cierto que no es lo mas dificil. Simplemente lee con detenimiento, sin desesperarte y trata de no pasar por alto nada, por mas elemental que parezca.
Entender y familiarizarte con ‘man’ te van a economizar tiempo, y sobre todo, podras evitar algunas de estas respuestas:
RTFM (Read the F—-ng Manual)
RTMFM (Read The Mother F—-ng Manual)
JFGI (Just F—-ng Google It)
STFW (Search the F—-ng Web)
Entre otros…
Espero que este articulo te haya ayudado a comprender e interesarte mas por ‘man’, a la vez que te ayude a invitar a otros a usar Google cuando piensan que eres una enciclopedia online en MSN. ![]()
NOTA:
Ayudar al otro implica que logre su propósito. Si ese otro no se interesa en aprender o investigar, es porque su principal propósito es permanecer en ignorancia, así que no le des la respuesta a sus preguntas, y estarás ayudandolo igualmente ![]()
-- Jose P. Espinal http://blog.slackware-es.com
Hoy llegue a mi oficina un poco tarde, al revisar mi mail encuentro en mi inbox un mensaje de un colega linuxero (JCRP) que me planteo una peque~na pregunta (MUY apropiada) acerca de como hacer backups en dispositivos de cinta.
Pues bien; como sabran no soy un experto ni nada parecido, de modo que si me equivoco en algo por favor escribanme 
Lo primero que debemos hacer antes de crear un backup en una unidad de cinta es darse (leerse) un peque~no ‘man mt’ (si saben ingles. -Ahora que lo pienso, agregare una seccion en el blog para ir traduciendo las paginas de man-, si no es que ya alguien esta en eso por ahi
)
La herramienta mt es la que nos permite controlar dispositivos de cinta mageneticos.
Manos a la obra:
Veamos el status de la cinta (opcional):
# mt -f /dev/sr0 status
Veamos en que bloque estamos (opcional):
# mt -f /dev/sr0 tell
Todo en orden? Continuemos. Primero, rebobinar la cinta:
# mt -f /dev/sr0 rewind
Luego de esto, digamos que quieres hacer un backup del directorio ORACLE , y que quieres comprimirlo ( ahorremos un poco de espacio
):
# tar -czf /dev/sr0 ORACLE/
Ahora, veamos un listado de los archivos que hemos respaldado (backup)
# tar -tzf /dev/sr0
(NOTA: recuerden ojearse las paginas de manual de ‘tar’, luego de que le coges el hilo a esta herramienta, te daras cuenta que es muy muy util)
IMPORTANTE:
Vamos ahora a restaurar el backup que hicimos en la unidad de cinta
# cd / # mt -f /dev/sr0 rewind # tar -xzf /dev/sr0 ORACLE
Ahora, descarguemos la cinta:
# mt -f /dev/sr0 offline
OPCIONAL:
Si quieres borrar datos de la cinta usa
# mt -f /dev/sr0 erase
Espero que este articulo haya sido de utilidad, ya que en realidad mi experiencia con dispositivos de cinta es casi nula
(la omnisciencia no es una de mis cualidades
). Cualquier cosa, me escriben ![]()
-- Jose P. Espinal http://www.slackware-es.com
Comprimir archivos, descomprimir archivos, hacer backups, etc, etc. Son , sin duda alguna, tareas esenciales tanto para un usuario normal, como para un administrador de sistemas.
En esta ocasion veremos como comprimir, descomprimir, o hacer backups usando el comando tar de Linux.
NOMBRE
tar - La version GNU de la utilidad para archivar
SINOPSIS
tar [ - ] A --catenate --concatenate | c --create |
d --diff --compare | r --append | t --list | u --update |
x -extract --get [ --atime-preserve ] [ -b, --block-size N ]
[ -B, --read-full-blocks ] [ -C, --directory DIR ]
[ --checkpoint ] [ -f, --file [HOSTNAME:]F ] [ --force-local ]
[ -F, --info-script F --new-volume-script F ] [ -G, --incremental ]
[ -g, --listed-incremental F ] [ -h, --dereference ]
[ -i, --ignore-zeros ] [ -j, --bzip2 ] [ --ignore-failed-read ]
[ -k, --keep-old-files ] [ -K, --starting-file F ]
[ -l, --one-file- system ] [ -L, --tape-length N ]
[ -m, --modification-time ] [ -M, --multi-volume ]
[ -N, --after-date DATE, --newer DATE ]
[ -o, --old-archive, --portability ] [ -O, --to-stdout ]
[ -p, --same-permissions, --preserve-permissions ]
[ -P, --absolute-names ] [ --preserve ] [ -R, --record-number ]
[ --remove-files ] [ -s, --same-order, --preserve-order ]
[ --same-owner ] [ --numeric-owner ] [ -S, --sparse ]
[ -T, --files-from F ] [ --null ] [ --totals ]
[ -v, --verbose ] [ -V, --label NAME ] [ --version ]
[ -w, --interactive, --confirmation ] [ -W, --verify ]
[ --exclude FILE ] [ -X, --exclude-from FILE ]
[ -Z, --compress, --uncompress ] [ -z, --gzip, --ungzip ]
[ --use-compress-program PROG ] [ --block-compress ]
[ -[0-7][lmh] ]
NombreDeArchivo1 [ NombreDeArchivo2, ... NombreDeArchivoN ]
directorio1 [ directorio2, ...directorioN ]
Como es obvio, la cantidad de opciones y parametros que acepta el comando ‘tar‘ es sencillamente grotesco como para querer incluir un ejemplo para cada posible combinacion; de modo que me limitare a lo basico, a lo que realmente (bajo circunstancias normales) van a utilizar.
EJEMPLOS
tar -xvvf foo.tar
Extrae el archivo foo.tar
tar -xvvzf foo.tar.gz
Extrae el archivo gzippeado foo.tar.gz
tar -cvvf foo.tar foo/
Archiva los contenidos del folder foo en foo.tar
Primero lo basico:
Hay que entender que existe una ligera diferencia (en el mundo de comprimir/descomprimir) entre archivo y fichero. En ocasiones decimos que una carta, o algun httpd.conf, etc. son archivos, cuando en realidad son ficheros.
Un fichero es un conjunto de información que se almacena para consultarse o utilizarse posteriormente.
Un archivo es un conjunto de ficheros empaquetados (asi como cuando una secretaria archiva muchos documentos, algo parecido).
Con esta diferencia ya resaltada, podemos continuar.
Si tenemos el archivo (conjunto de ficheros empaquetados)
foo.tar y queremos descomprimirlo, es tan simple como usar:
# tar xvf foo.tar
-x (que es lo mismo que –extract, –get ) extrae los ficheros de un archivo , de modo que era lo mismo decir ‘tar –extract -vf foo.tar‘
-v ( –verbose ) muestra en pantalla los ficheros que va extayendo de foo.tar (esto es OPCIONAL)
-f ( –file ) sirve para indicar el nombre del archivo que se descomprimira
Toma en cuenta que puedes encontrarte un archivo que aparte de archivado este comprimido ya sea con la herramienta ‘bzip2‘ o con ‘gunzip‘, en dado caso el nombre del archivo deberia indicarlo con una extension adicional, ej.
foo.tar.gz – Archivado y comprimido con gunzip
para el cual debes usar:
# tar xvzf foo.tar.gz
.tar.bz2 – Archivado y comprimido con bzip2
usar:
# tar xvjf foo.tar.bz2
r mas opciones, verificar el manual de ‘tar‘.
COMPRIMIR FICHEROS | HACER BACKUPS
Comprimir un fichero es muy semejante a descomprimir un archivo con el comando ‘tar‘, la unica diferencia es que en vez de usar el parametro ‘x‘ (que es para extraer), usaremos ‘c‘ (que viene de –create , para crear un nuevo archivo -o sea, conjunto de ficheros comprimidos-)
De modo que para archivar el fichero ‘carta.txt’ usamos:
# tar cvf carta.tar carta.txt
Si quieres archivar y comprimir (usando gunzip) el fichero ‘carta.txt’ usa:
# tar cvzf carta.tar.gz carta.txt
Si quieres archivar y comprimir (usando bzip2) el fichero ‘carta.txt’ usa:
# tar cvjf carta.tar.bz2 carta.txt
Si quieres archivar todo un directorio, digamos ‘canciones/’ (porque quieres hacer un backup o por cualquier razon, usa:
# tar cvf canciones.tar canciones/
Si quieres archivar y comprimir todo un directorio, usa:
# tar cvzf canciones.tar.gz canciones/
o
tar cvjf canciones.tar.bz2 canciones/
NOTAS:
-Agregar el .tar.gz cuando creas un archivo comprimido NO es obligatorio, si no lo haces, y en vez de crear fulano.tar.gz decides llamarle simplemente fulano, no moriras y funcionara perfectamente bien; Pero le deseo suerte al pobre diablo que tendra que descomprimir eso en un futuro sin saber que tipo de archivo es ![]()
-Puedes archivar multiples ficheros, en la siguiente forma:
# tar cvf nombredearchivo.tar fichero1 fichero2 fichero3 fichero4
-Si quieres agregar un fichero a un backup existente, no tienes que extraer todo para luego volver a archivar (y comprimir, si lo hiciste), usa la opcion -A (Append) para agregar el fichero que se te quedo afuera:
# tar -Af cancion_olvidada.mp3 backup_de_canciones.tar
Y asi por el estilo
, si me he olvidado algo me avisan, y si me equivoque en algo, tambien
(soy humano, propenso a errores).
Poco a poco ire adicionando ejemplos a este articulo de manera que sirva de referencia rapida a la hora de utilizar ‘tar’. Hasta luego
PS.
Recuerden, ‘man’ es su amigo,
-- Jose P. Espinal http://www.slackware-es.com
En una pasada ocasion vimos como agregar un usuario en Slackware Linux, ahora veremos como borrar un usuario; para lo cual se usa el comando userdel:
NOMBRE
userdel - Borra una cuenta de usuario y archivos relacionados
SINOPSIS
userdel [-r] usuario
DESCRIPCION
El comando userdel modifica los archivos de cuentas del sistema, borrando
todas las entradas que hagan referencia a usuario.
El usuario nombrado debe existir.
Las opciones que aplican al comando userdel son:
-r Los archivos en el directorio hogar del usuario seran removidos
junto con el directorio hogar mismo y los archivos de mails.
Los demas archivos alojados en el sistema de archivos deberan ser
buscados y eliminados manualmente.
De forma mas simple y llana, si quieres borrar el usuario ‘pepito’ que una vez creamos, es tan simple como usar:
userdel -r pepito
Tan simple como eso ![]()
-- Jose P. Espinal http://www.slackware-es.com
Agregar un usuario en Slackware Linux es una tarea bastante simple, y muy importante; a continuacion explicaremos como hacerlo.
Sintaxis:
useradd [-c comentario] [-d home_dir]
[-e fecha_expir] [-f tiempo_inactividad]
[-g grupo_inicial] [-G grupo[,...]]
[-m [-k skeleton_dir]] [-o] [-p passwd]
[-s shell] [-u uid] pepito
Detalles:
Parametros OPCIONALES
[-c comentario] [-d home_dir]
[-e fecha_expir] [-f tiempo_inactividad]
[-g grupo_inicial] [-G grupo[,...]]
[-m [-k skeleton_dir]] [-o] [-p passwd]
[-s shell] [-u uid]
Los parametros encerrados en llaves (SIEMPRE) indican que son opcionales; es decir no es obligatorio usarlos. de modo que lo unico obligatorio es el comando adduser y el nombre del usuario pepito (en nuestro caso). Asi que (de un modo muy simple y escueto) puedes agregar un usuario con tan solo escribir:
adduser pepito
Claro, que lo anterior te crearia un usuario sin capacidades de loggearse en el sistema, sin password, y sin un directorio para residir dentro de ‘/home’, asi que hagamos algunas modificaciones al comando anterior:
useradd -g users -m -s /bin/bash pepito
Nota: que no se te ocurra usar los parametros con los corchetes ‘[ ]’, eso es solo para indicar cuales son opcional y cuales no.
Ahora si; hemos usado:
‘-g’ para indicarle que el grupo inicial al cual pertenecera el usuario ‘pepito‘ sera ‘users’.
‘-m’ para que cree un directorio en ‘/home’ el cual sera el hogar del usuario ‘pepito’ y llevara su mismo nombre. ‘/home/pepito’.
‘-s’ para indicarle cual sera el interprete de comandos por defecto (shell ), en nuestro caso, es bash.
Y por ultimo, vamos a asignarle un password a nuestro querido ‘pepito’, para eso usamos el comando
passwd
passwd pepito
Primero te pedira que escribas el nuevo password, luego pediras que reescribas el password para confirmar.
Notas:
a) Trata de NO usar un password debil, algo asi como ‘tamalito’ o ‘banderita’; se prudente, esto es Linux, no Winsh*t.
b) El hecho de que haya usado el interprete ‘/bin/bash’ no indica que debas hacerlo tambien, puedes elegir el que prefieras; si no sabes cuales tienes disponibles buscalos en ‘/etc/shells’. Aunque en realidad te recomiendo usar bash.
c) No esta mal agregar un usuario sin privilegios para loggearse, solo que tienen otro uso (ej. ejecutar un servicio como un usuario determinado, etc.)
-- Jose P. Espinal http://www.slackware-es.com