Professional Documents
Culture Documents
OBJETIVOS
El objetivo de esta práctica es que empecéis a trabajar con el intérprete de comandos (shell) de Linux, que en
nuestro caso será bash (Bourne again shell), ya que es el más potente y más utilizado. La práctica con el shell
os dará agilidad para configurar un sistema y os permitirá crear programas de utilidad fácilmente (shell
scripts).
Se espera que al final de la práctica seáis capaces de realizar los ejercicios que se plantearán, y que requerirán
dominar los siguientes aspectos:
§ Listar directorios en cualquier formato.
§ Moverse por los directorios, crearlos, moverlos y borrarlos.
§ Copiar, borrar y mover ficheros.
§ Crear ficheros de texto con vi.
§ Redirigir la salida de programas a ficheros. Combinar varios programas con tuberías.
§ Aplicar los filtros grep, wc, head, tail y sort a ficheros de texto o a la salida de otro programa.
Para ello deberéis probar los ejemplos que vienen en esta práctica pero, sobre todo, investigar por vuestra cuenta y
hacer todas las pruebas necesarias para dominar perfectamente las técnicas anteriores y las opciones
principales de los comandos mencionados. Pensad en todas las pegas, probad todo lo que se os ocurra, los
casos normales y los raros.
REQUISITOS PREVIOS
Tener instalado Linux en el ordenador (en esta práctica cualquier versión de Linux servirá), y tener creado un
usuario distinto de root, que durante toda la práctica llamaremos toni y que deberéis sustituir por el vuestro. Se
supone que su directorio origen es /home/toni/ y que por defecto utiliza bash, que será el caso a no ser que
hayáis tocado algo.
ACTIVIDADES DE LA PRÁCTICA
Cuando iniciamos el sistema, lo primero que os pide Linux es que introduzcáis vuestro usuario (login:); deberéis
hacerlo (en nuestro ejemplo, toni) y, a continuación, escribir la contraseña (lo que tecleéis no se mostrará en
pantalla, para que nadie fisgue por encima del hombro).
El intérprete de comandos aparece como una pantalla en negro, con un cursor que nos indica que podéis escribir;
ahí le daréis órdenes, que él irá ejecutando si son correctas o tenéis permiso para ejecutarlas. Cuando
completéis una orden, se la “enviaréis” a bash apretando la tecla Intro. Antes del cursor aparece un prompt,
unos símbolos que dan cierta información y de paso no dejan la pantalla completamente en negro, como por
ejemplo [toni@ordenata home]$ (usuario, ordenador en el que está y directorio actual, enseguida veremos
qué es todo esto).
Si no os gusta la orden que estáis escribiendo, podéis borrar todo lo escrito con Ctrl+C; si queréis repetir una
orden anterior, podéis recuperar las últimas órdenes con flecha arriba y flecha abajo (historia de comandos).
Además, en Linux hay varias consolas, podéis trabajar con varias sesiones a la vez (mirando la ayuda con una y
probando comandos con la otra, por ejemplo); con Alt+F1, Alt+F2, ... se puede cambiar de consola.
Incluso en cada una de ellas podéis ser un usuario distinto.
La información se guarda en ficheros (o archivos, que es lo mismo), y los ficheros se organizan en directorios,
espacios que contienen ficheros y otros directorios (pero un fichero sólo puede contener información: texto,
programas, dibujos, ... no otros ficheros o directorios).
Es muy importante evitar trabajar como root a menos de que sea completamente necesario hacerlo; para todas las
pruebas y para el trabajo habitual se deberá trabajar como un usuario normal, porque como root podéis echar a
perder todo el sistema con una orden aparentemente inocente.
Otra operación delicada es la de apagar el sistema: se debe hacer mediante la orden shutdown -h now (o su
versión abreviada, halt) que, por cierto, normalmente sólo puede utilizar root. También está shutdown -r
now o simplemente reboot para reiniciar el sistema.
Si lo único que queremos es cerrar una sesión, o sea, dejar de trabajar como root pero no apagar el ordenador,
tenemos que utilizar la orden exit, que nos devuelve a la pantalla de login para que entremos con otro usuario.
Nota: Linux es perfectamente capaz de distinguir una mayúscula de una minúscula, así que no intentéis engañarle.
Nota para los usuarios de DOS/Windows: en Linux no hay unidades como en estos sistemas operativos, que
tienen A: para la disquetera, C: para el disco duro, etc., sino que todos los discos que haya en el sistema se ven
como directorios debajo de la raíz (por ejemplo, la disquetera puede ser /mnt/floppy/).
El concepto de ruta absoluta y relativa es fundamental, y no sólo se utiliza con ls sino con casi todos los comandos
de bash. Os recomiendo que cuando escribáis órdenes probéis a hacerlo de las dos maneras. ¿Cómo escribiríais
ls tmp/ como ruta absoluta?
Truco: bash autocompleta los comandos, así que si escribís ls /h y apretáis el tabulador, él completa la orden y
escribe el resto, quedando ls /home/. Esta característica os ahorrará mucho teclear.
La opción -a (all) muestra todos los ficheros del directorio. En Linux, los ficheros que empiezan con un punto son
ficheros ocultos, que no aparecen en un ls normal. Los ficheros que veis, como .bash_profile, son ficheros de
configuración que ya toquetearéis en su momento, pero ahora fijáos bien en dos entradas: ./ y ../ (Así,
directamente, ¿qué son, ficheros o directorios?). La entrada ./ representa el directorio actual, de forma que si
escribís ls ./ estáis haciendo lo mismo que con ls a secas, o sea, viendo los contenidos del directorio actual.
Ya veremos qué utilidad tiene (que la tiene). La entrada ../ es más útil de momento, pues hace referencia al
directorio padre del actual, o sea, el directorio en el que está el actual. Si el actual es /home/toni/, el padre será
/home/, y haciendo ls ../ veremos qué contiene. Esta es la ruta relativa para llegar a nuestro padre, y por
supuesto también habrá una ruta absoluta equivalente (intentad encontrarla).
¿Qué interesa utilizar, rutas absolutas o relativas? En cada caso, la forma que resulte más cómoda.
7 Listad los contenidos del directorio /etc/ mediante rutas relativas y absolutas, con y sin opción de listado
largo.
7 Entrad en el sistema como root y listad los contenidos de /home/toni/ (o el usuario que hayáis creado).
7 Entrad como toni y listad los contenidos de /root/ (que es el directorio origen de root). ¿Algún problema? ¿A
qué creéis que se debe?
Podéis combinar dos opciones (por ejemplo, -l y -a) de diversas maneras (en general no importa el orden):
ls -l -a ls -al
ls -a -l ls -la
Listad los contenidos del directorio /etc/ (en el que se guarda la configuración del sistema). En primer lugar veréis
que la pantalla se desplaza porque hay muchas entradas; ya veremos cómo remediar esto. Pero imaginad que
estamos buscando un fichero del que no recordamos su nombre, pero sabemos que empieza por p: podemos
escribir lo siguiente, y veremos todos los ficheros y directorios de /etc cuyo nombre empieza por p:
ls /etc/p*
Porque el * representa cualquier combinación de letras (una, varias o ninguna), y por tanto ls sólo exige que
empiece por p, y detrás puede haber lo que sea (o nada más que la p). Si escribierais ls /etc/*p* veríais
todas las entradas que tienen alguna p (enmedio, al principio o al final).
Si ahora escribís ls /etc/rc?.d veríais el contenido de los directorios rc1.d, rc2.d, etc., ya que el ¿ se ha
sustituido por un carácter cualquiera (ni menos ni más que uno). ls /etc/???? muestra todas las entradas de
4 letras (ni más ni menos) de /etc.
Por último, si hacéis ls /etc/[ps]* veréis todas las entradas de /etc cuyo nombre empieza por p o por s.
Por cierto, ls es un programa más, que se encuentra en /bin/; salvo algunos comandos internos como cd, todos los
comandos de Linux son programas como los que podéis hacer vosotros.
7 Buscad el programa ls en el directorio /bin/ y mostrad su información con ls -l.
7 Averiguad qué directorios hay dentro de vuestro directorio origen y qué contienen (ficheros ocultos
incluidos).
7 ¿Funciona correctamente la orden ls .* para ver qué ficheros ocultos hay en vuestro directorio origen? ¿Qué
creéis que ocurre?
7 Listad todos los ficheros de /etc/ cuyo nombre empiece por z de forma que salgan primero los de menor
tamaño.
También interesa saber que cd sin parámetros nos devuelve al directorio origen estemos donde estemos.
7 Desde vuestro directorio origen, id a /etc/ usando una sola orden cd pero con rutas relativas. Ahora id a
/etc/init.d/ pero usando rutas absolutas, y por último comprobad que con cd a secas volvéis a vuestro
directorio origen.
7 Cread un directorio “listar” en vuestro directorio origen ycomprobad que, aunque esté recién creado, contiene
los enlaces ./ y ../ .
7 Cread un directorio alumnox en /home/. ¿Os da error? ¿A qué creéis que es debido?
7 Intentad crear la siguiente estructura de directorios en vuestro directorio origen, aprovechando la opción -p de
mkdir:
eval1
|-- examen
| |-- practica
| `-- teoria
|-- juegos
`-- trabajos
`-- scripts
Sintaxis:
tree [opciones] [directorio] # Si no se especifica directorio, crea el árbol a
# partir del actual
Opción Significado
-d Muestra sólo los directorios, no los ficheros.
-p Muestra los permisos de cada fichero.
-u Muestra el propietario de cada fichero.
-g Muestra el grupo de cada fichero.
-s Muestra el tamaño de cada fichero.
-D Muestra la fecha de modificación de cada fichero.
-L n Sólo desciende n niveles (o sea, directorios).
7 Obtened un árbol que muestre qué directorios nacen directamente en el directorio raíz, pero no sus
subdirectorios.
7 Obtened un árbol que muestre todos los ficheros y directorios dentro de vuestro directorio origen. Haced que
aparezca toda la información posible junto a los nombres de ficheros.
man (manual)
Es el comando universal de ayuda en UNIX. La forma más sencilla de invocarlo es escribiendo man comando, y
así obtenemos la ayuda correspondiente al comando (si está disponible). Para salir de man hay que apretar la
letra q.
man ls # Ayuda de ls
man tree # Ayuda de tree
man man # Ayuda de man
info (información)
Es un sistema de ayuda similar a man pero más complejo. Algunos manuales están más actualizados en info que
en man.
apropos (a propósito)
Es una utilidad que busca en todos los manuales disponibles y averigua en qué comandos aparece la palabra que le
indiquemos. A continuación podremos acudir a los manuales de los comandos indicados para saber más sobre
ese tema.
# Por ejemplo, queremos saber cómo cambiar la contraseña, así que buscamos
# los comandos que contengan la palabra password en su manual
7 Utilizad apropos para descubrir información relacionada con los términos siguientes: Ethernet, ARP, telnet.
→i→
Modo comando Modo edición
← Esc ←
El programa empieza en modo comando (órdenes de guardar, salir, etc.) y apretando i (insertar) vamos a modo
edición, que es donde se puede escribir y corregir el texto. Para volver a modo comando, apretamos Esc.
En modo edición podréis utilizar las teclas habituales (flechas, retroceso, intro, etc.). En modo comando se pueden
utilizar las siguientes órdenes:
Orden Significado
:w write (guardar)
:w fichero write (guardar en el fichero indicado)
:wq write and quit (guardar y salir)
:q quit (salir; si no has guardado no te deja)
:q! quit (salir sin guardar)
:edit nomfich edit (si nomfich existe lo abre, si no edita uno
nuevo con ese nombre)
En cualquier momento podéis apretar F1 para ver la ayuda (y :q para salir de ella). Probad a crear varios ficheros
de texto y a guardarlos; os irán bien para pruebas posteriores.
7 Cread un fichero de texto con vi y escribid en él una agenda, con una línea por persona con su nombre,
dirección de correo y población de residencia. No olvidéis guardarlo.
7 Abrid el vi sin indicar ningún fichero y, una vez dentro, cargad un fichero y modificadlo.
También está la opción de copiar un directorio completo recursivamente, o sea, el directorio y todo lo que
contiene:
cp -R prueba/ otraprueba/
En otraprueba tendríamos una copia de todos los subdirectorios y ficheros de prueba.
Los comodines (*, ?, [abc...]) también se pueden usar con cp (cp /etc/p* prueba/).
Opción Significado
-f Sobreescribe los ficheros destino si ya existen, sin
preguntar ni nada.
-i Pregunta antes de sobreescribir un fichero existente (lo
contrario que -f).
-R Copia recursivamente (todos los subdirectorios que
encuentre y sus contenidos).
-s En vez de copiar los ficheros, crea enlaces simbólicos
a los mismos.
-u Sólo copia cuando el fichero origen es más reciente
que el destino (o si no existe).
7 Copiad todos los ficheros de /etc/sysconfig/network-scripts/ que empiecen por ifcfg a vuestro directorio
origen.
7 Copiad /etc/passwd a vuestro directorio origen, dándole el nombre de usuarios (todo en una sola orden).
Por defecto rm pregunta si queremos borrar cada elemento; si queréis evitar que pida confirmación, utilizad la
opción -f (force). Si os queréis asegurar de que os pide confirmación, -i (interactive).
7 Cread otra copia del fichero usuarios del ejercicio anterior. Borradla con rm.
mv (move, mueve ficheros y directorios)
Notad que al mover un fichero se pierde el original (o sea, cambia de sitio, no es que se haga una copia. Cuidadito,
no hagáis mv con ficheros del sistema).
7 Cread un directorio en vuestro origen llamado sistema y moved a él los ficheros ifcfg y el fichero usuarios,
dándole el nombre de passwd.
Hemos visto que ls --help nos muestra ayuda y opciones de ls, pero el problema es que no cabe toda en
pantalla. También hemos visto las órdenes more y less para ver ficheros largos. ¿Cómo combinarlos? Hay
varias formas, y todas consisten en dirigir la salida estándar de ls (lo que muestra por pantalla) a otro sitio que
no sea la pantalla.
§ Redirección a un fichero:
ls --help > ayudals
more ayudals
La primera orden redirige la salida de ls --help al fichero ayudals, que se creará en el directorio actual y
contendrá el texto que habríamos visto por pantalla (y que no hemos visto). Después vemos qué pone con more
(o con less, o con vi). Hay que tener en cuenta que si ayudals ya existe se borrará y se sobreescribirá con la
nueva información.
§ También podéis evitar el paso intermedio de crear un fichero y leerlo con more: se puede conectar la salida de
uno con la entrada del otro directamente de esta manera:
ls --help | more
La entrada de more, que normalmente es un fichero, en este caso es la salida de ls --help porque los hemos
conectado con una tubería (pipe). (El símbolo | se escribe pulsando AltGr+1.)
§ Por último, cuando un archivo espera su entrada desde la entrada estándar, o sea, el teclado, es posible
obligarle a cogerla de un fichero en su lugar: comando < fichero. Esta opción se utiliza poco porque la
mayoría de comandos aceptan un fichero como entrada, pero conviene conocerla.
Vamos a hacer otra prueba para aprender algo más de este tema:
ls /[mr]* > fich
Esta orden debería escribir el resultado de la orden en fich; sin embargo, en el fichero dice que hay un directorio
en la raíz que empieza por m, mnt/, y por pantalla nos sale el mensaje
ls: /root: Permiso denegado
¿Por qué no ha escrito esto en fich? Pues porque es un error, y en Linux los mensajes de error no salen por la
salida estándar sino por la salida de errores. Al escribir > fich sólo estamos redirigiendo la salida estándar,
y la de errores sigue saliendo por la pantalla. Aunque esto tiene remedio:
ls /[mr]* > fich 2> errores # En errores se guardan los errores, y
# en fich la salida estándar
ls /[mr]* &> result # Lo guarda todo en result, errores y
# salida estándar
ls /[mr]* 2> errores # Guarda errores y muestra lo demás por
# pantalla
7 Almacenad en un fichero llamado arboletc la estructura de directorios del directorio /etc/ (la que os dé el
comando tree).
7 Almacenad la ayuda (man) del comando ls en un fichero llamado ayuda-ls. Haced lo mismo con los comandos
tree y cp (ficheros ayuda-tree y ayuda-cp respectivamente).
grep (general regular expression processor, muestra las líneas que contienen el patrón de texto indicado)
Imaginad que tenemos que buscar todos los ficheros de /etc que contengan alguna z en su nombre. Tenemos dos
opciones:
# 1.- Hacerlo sólo con ls (¿cómo?)
# 2.- Utilizar el comando grep:
ls /etc | grep z
grep muestra las líneas que contengan cierto patrón, en este caso simplemente una “z”. También podríamos haber
puesto una palabra entera como patrón.
7 Listad todos los ficheros de /etc/ que contengan la palabra “init” en su nombre. Hacedlo de las dos formas:
sólo con ls, y con ls y grep.
En este último caso parece que no podemos dejar de escribir. Si hacemos Ctrl+C abortamos el programa (termina
sin guardar los resultados por ejemplo en grep z > fich2), pero para indicarle que queremos terminar la
entrada “bien” hemos de decirle que acaba el fichero, apretando Ctrl+D.
Opción Significado
-c Dice cuántas líneas contienen el patrón (aunque lo tengan repetido
sólo las cuenta una vez).
-i No distingue mayúsculas y minúsculas.
-l Muestra sólo qué ficheros contienen el patrón.
-L Muestra sólo qué ficheros no contienen el patrón.
-n Antepone el número de línea dentro del fichero.
-v Invierte la búsqueda (muestra las líneas que no contienen el patrón,
etc.).
-h No muestra el nombre del fichero, sólo las líneas que concuerdan.
-q Modo silencioso, no muestra nada por pantalla y sólo busca la
primera coincidencia (más adelante se verá su utilidad).
grep no sólo permite buscar textos literalmente, sino que acepta lo que en informática se llaman expresiones
regulares, que son una forma de especificar todos los textos que tengan una forma determinada.
Opción Significado
-c Número de caracteres
-l Número de líneas
-L Longitud de la línea
máxima
-w Número de palabras
Opción Significado
-b Ignora los blancos antes de ordenar
-d Ordena sólo números y letras, no signos
-f Trata todo como mayúsculas (puede estar por defecto)
-n Trata los números como tales (numéricamente 13>7 pero alfabéticamente 13<7)
-r Invierte el resultado
-t carácter Indica que carácter es el elemento que separa un campo de otro (por ejemplo en /etc/passwd
pondríamos -t : )
-k pos1 Indica el primer campo por el que hay que ordenar (por ejemplo para ordenar por id usuario
en /etc/passwd habría que poner, entre otras opciones, -k 3. Hay que tener en cuenta que
empieza a contar por 1, y que si hay dos campos iguales, sigue mirando los siguientes para
desempatar.)
-k pos1,pos2 Sólo tiene en cuenta los campos desde pos1 hasta pos2 para ordenar (ambos inclusive). Por
ejemplo para ordenar sólo por id usuario e id grupo, -k3,4. Para ordenar sólo por id grupo, -
k4,4.
Nota 2: campos de ls -l
Tipo de Número de Propietario Grupo Tamaño Marca de Nombre (y
entrada y enlaces (bytes) tiempo enlace)
permisos
Una de las actividades más importantes para una buena administración de un sistema es la de detectar ficheros
potencialmente peligrosos o, al menos, perjudiciales para el sistema: ficheros con permisos sospechosos,
demasiado grandes, que hace mucho que no se utilizan y están ocupando espacio inútilmente, etc.
Para llevar este tipo de controles a cabo, la herramienta más potente que ofrece Linux es el comando find, que
como veréis tiene una gran cantidad de opciones (casi un pequeño lenguaje de programación), reflejo de su
gran versatilidad.
También veremos que, además de encontrar ficheros según las condiciones que queramos, también permite
realizar una serie de operaciones sobre los ficheros que encontrados (como borrarlos), solo o en combinación
con el comando xargs.
El fichero o ficheros son los ficheros y/o directorios sobre los que se quiera buscar. Hay que tener en cuenta que
por defecto find hace búsquedas recursivas, o sea que si ponemos find /home/luis/ buscará en /home/luis/ y en
todos sus subdirectorios. Si no se le indican ficheros, busca en todos los subdirectorios del directorio actual.
El comando find recorre todos los directorios, examina fichero a fichero y decide uno a uno si cumple las
condiciones que le hemos indicado. Si es así, escribe su nombre completo (podemos ordenarle que haga otras
cosas con el fichero).
Una orden con find puede llegar a ser complicada (sí, esta orden hace algo, y útil, por cierto):
find /home/pep -atime -10 -type f -not -name '*.tmp' -exec grep -l virus '{}' ';'
Aunque antes de llegar a todo eso vamos a ir viendo sus opciones paso a paso para poder ir comprendiéndolo
mejor.
NOTA: find lista ficheros y directorios, pero en los ejemplos se utilizará fichero para hacer referencia tanto a unos
como a otros.
# Aplica la acción por defecto (mostrar el nombre completo, o sea, con ruta y
# todo, de los ficheros) a todos los ficheros de /home/laura y subdirectorios
find /home/laura/
# Lo mismo otra vez, pero en vez de mostrar los nombres los guarda
# en listado.txt. Aunque ya sabéis otra forma de conseguir lo mismo, ¿no?
find /home/laura -fprint listado.txt
# Ahora buscamos los ficheros que tengan un nombre determinado, o que siga un
# patrón determinado
find /home/laura/ -name prác4.c # Sólo muestra prác4.c (si existe)
find /home/laura/ -name “prác?.c” # Muestra todos los prác?.c
find /home/laura/ -name “prác[12].c” # Muestra prác1.c y prác2.c
find /home/laura/ -iname lista.txt # No distingue mayúsculas/minúsculas
Es importante darse cuenta de la diferencia entre las dos últimas órdenes; casi siempre que trabajéis con find y
condiciones temporales, utilizaréis el + y el -, porque no os interesará un momento exacto en el tiempo sino un
intervalo (en los últimos tres días, en la última media hora, etc.).
Nota para curiosos/as (si os sentís satisfechos de momento, os la podéis saltar): ¿qué significa el $$ anterior? En
bash hay una serie de variables de entorno con información interesante, como por ejemplo $UID, que lleva
nuestro número de usuario actual; haciendo echo $UID podéis consultarlo. Estas variables empiezan con un
$. La variable $$ representa el PID (process identifier, un número que identifica cada proceso del sistema) del
proceso actual, de forma que si hacéis echo $$ aparecerá el número del proceso (que es el intérprete de
comandos que estáis ejecutando; con la orden ps, explicada más abajo, lo podéis comprobar).
Pues bien, si hacéis touch -t02010000 /tmp/fecha$$ estaréis creando un fichero en /tmp/ que se llamará, por
ejemplo, /tmp/fecha4210, suponiendo que 4210 sea el PID de vuestra sesión bash actual.
Tened en cuenta también que cada sesión de bash abierta tendrá un PID diferente (son procesos separados), y
cada vez que arranquéis el ordenador posiblemente bash tendrá un PID distinto.
¿Qué utilidad tiene esto, por qué no crear /tmp/fecha? Con órdenes de bash podéis crear programas útiles
(scripts), y posiblemente los utilicen varios usuarios simultáneamente. Si uno de ellos crea un fichero
/tmp/fecha con unos valores y otro usuario, justo después, crea otra copia de /tmp/fecha (con su propia fecha),
será fácil que el primer usuario coja el fichero que no le corresponde y acabe tomando como referencia una
fecha incorrecta. Si cada usuario (cada proceso de bash) identifica el fichero con su PID, no habrá
posibilidad de confusión y por tanto vuestro script podrá ser utilizado por muchos usuarios simultáneamente.
Tened en cuenta que los prefijos + y - no sólo se pueden usar con -size, sino con otros muchos argumentos, para
indicar si buscamos los que sean iguales (sin prefijo), los mayores que el valor (con +) o los menores (con -).
# Tipo de fichero
find / -type b # Dispositivos de bloques (discos)
find /home/ -type d # Sólo los directorios
Una cosa que fastidia bastante del find es que al hacerlo sobre la raíz intente mirar en el CD o en la disquetera y dé
error porque no hay discos dentro. Eso tiene fácil solución, por suerte:
find / -nouser -mount # No mira en otros sistemas de ficheros, sólo
# en la partición actual
Y todos estos argumentos, y alguno más que hay, se pueden combinar en expresiones lógicas para poder definir
condiciones más complejas:
Tened en cuenta que si no se especifica ningún operador, por defecto utiliza -and. También tened en cuenta que si
en un comando hay varias condiciones enlazadas con -and y una de ellas da F para un fichero, ya no seguirá
evaluando las restantes condiciones para ese fichero, sino que pasará a evaluar el siguiente fichero.
Por último, está la opción que permite utilizar cualquier otro comando para realizar búsquedas más específicas.
Hay otra manera de conseguir el mismo resultado, y es utilizar el valor que devuelve -exec como condición: -exec
devuelve V si el comando ejecutado (grep) devuelve un 0, y F en caso contrario. En general los comandos de
Linux devuelven un 0 cuando tienen éxito y un valor distinto de 0 cuando no lo tienen; por ejemplo grep
devuelve un 0 si ha encontrado la palabra buscada en el fichero. Así que en este caso para los ficheros que
contengan la palabra ‘root’ grep devolverá un 0, y por tanto se cumplirá la condición y se ejecutará la acción -
print:
# Problema: grep nos enseña las líneas que contienen ‘root’, y sólo
# queremos ver los nombres de los ficheros. Hay una opción de grep que
# viene muy bien aquí: -q, que sólo busca las líneas pero no las muestra
# por pantalla.
find /home/ -mtime 3 -exec grep -q root ‘{}’ ‘;’ -print
Veamos ahora una referencia más formal de todas las opciones, condiciones, acciones y operadores que se pueden
utilizar con find. Recordad que “fichero” indica tanto ficheros como directorios. Tened en cuenta que find va
procesando individualmente cada fichero que encuentra.
Opciones
Sintaxis Significado
-maxdepth n Máximo número de niveles de subdirectorio que recorre (-maxdepth 1 sólo mira en el directorio
actual)
-depth Al recorrer subdirectorios, evaluar antes sus contenidos que el propio subdirectorio (útil en
combinación con comandos como tar, por ejemplo).
-mount Sólo busca en el sistema de ficheros donde empiece la búsqueda, no pasa a otros.
-follow Si encuentra un enlace simbólico a un directorio, lo sigue (por defecto no lo hace).
-daystart Los comandos de tiempo cuentan desde el momento actual, así que por ejemplo -atime -2 cuenta
las últimas 48 horas. Esta opción hace que el tiempo se cuente desde el principio del día actual, de
forma que -daystart -atime -2 cuenta los últimos dos días, ayer y anteayer.
Acciones
Sintaxis Significado Ejemplo
-print Escribe el nombre completo de los find /home/manuel/ -print
ficheros. Si no se indica otra acción, por
defecto se aplica ésta.
-fprint fich Escribe el nombre completo de los ficheros find /home/pedro/ -fprint
en fich. misfichs.txt
-ls Muestra la información completa de los find /home/manuel/ -ls
ficheros (la que sacaría ls -dils).
-fls fich Como el anterior pero escribiéndola en find /home/pedro -fls misfichs.txt
fich.
-exec comando [opciones] Ejecuta el comando con sus opciones sobre find /home/laura/ -exec cat ‘{}’ ‘;’
‘{}’ ‘;’ cada fichero (representado por ‘{}’). # En vez de mostrar sus nombres,
Termina con el ‘;’. Ver ejemplos arriba. # muestra su contenido
Devuelve V si el comando devuelve 0 (sin
error) o F en caso contrario (puede usarse
para aplicar condiciones más complejas).
-ok comando [opciones] ‘{}’ Como el anterior, pero pide confirmación find /home/toni/ -ok rm ‘{}’ ‘;’
‘;’ para aplicar el comando a cada fichero. # Pregunta si borra cada fichero o no
-print0 Equivalen a las acciones sin 0 (cero), pero
-fprint0 fich terminan los nombres de ficheros con un
cero binario (como en C) para que otros
comandos puedan leer nombres con
caracteres extraños o espacios (por
ejemplo, xargs -0).
Operadores
Sintaxis Significado Valor devuelto
-not expresión Niega el valor devuelto por expresión (que puede ser El contrario al que devolvería la
una condición, una acción o una expresión compuesta expresión.
por varias condiciones y/o acciones).
expr1 -and expr2 Calcula la Y lógica sobre los valores devueltos por expr1 Y expr2
expr1 y expr2. Equivale a no poner nada, o sea, a dejar
expr1 expr2.
expr1 -or expr2 Calcula la O lógica sobre los valores devueltos por expr1 O expr2
expr1 y expr2.
“(“ expresión “)” Los paréntesis permiten forzar el orden de las El que devuelva expresión.
operaciones.
+número Las condiciones que lo permitan devolverán verdadero Depende de la condición.
si el valor buscado es superior a número.
-número Las condiciones que lo permitan devolverán verdadero Depende de la condición.
si el valor buscado es inferior a número.
Vemos que lo que hace el ejemplo es pasarle los nombres de los ficheros encontrados por find a xargs, que a su
vez los pone como parámetros de cat (o sea, que xargs hace que se ejecute cat /home/luis/prueba.txt
/home/luis/carta.txt).
Es importante darse cuenta de que la diferencia entre la acción -exec de find y xargs es que el primero ejecuta el
comando una vez para cada fichero que cumple las condiciones, o sea que si hacemos un -exec wc, hará un wc
para cada fichero que cumpla las condiciones de find; sin embargo, xargs espera a que find encuentre todos los
ficheros que cumplen las condiciones y entonces ejecuta un único wc sobre todos los ficheros a la vez. Veamos
la diferencia con un ejemplo:
# wc -l fichero a fichero muestra el número de líneas de cada uno
# Sólo queremos contar las líneas de los ficheros de menos de 100 bytes
$find -size -100c -exec wc -l ‘{}’ ‘;’
3 ./prueba.txt
7 ./texto.txt
8 ./lista.txt
Un consejo con xargs: es bastante interesante ejecutar primero el find sin xargs para ver qué ficheros selecciona, y
cuando se haya comprobado que todo funciona bien, entonces aplicar el xargs, sobre todo cuando este
comando va a ejecutar alguna orden peligrosa (borrar todos los ficheros, moverlos, etc.).
7 Cread un fichero con el contenido de todos los ficheros del usuario “pirato“ que contengan la palabra “virus”
o “formatear”.
Práctica 2 de redes de área local: El intérprete de comandos de Linux 17