Está en la página 1de 17

REDES DE ÁREA LOCAL

PRÁCTICA 3: EL INTÉRPRETE DE COMANDOS DE LINUX

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

Actividad 1. Empezando a trabajar con el sistema

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).

Práctica 2 de redes de área local: El intérprete de comandos de Linux 1


Cuando estéis trabajando en la consola, en cada momento estaréis situados en un directorio en concreto, que será
vuestro directorio actual (el último elemento del prompt lo indica; la orden pwd, o sea, print working
directory, también nos lo dice, pero de forma completa). Cada usuario tiene un directorio origen, que es el
directorio actual cuando entra en el sistema y el lugar donde debe guardar sus cosas (y hacer sus
experimentos).

Hay que saber que en Linux hay tres tipos de usuarios:


§ El administrador, root, que es todopoderoso en su sistema Linux y puede acceder a todos los ficheros y
directorios. Su directorio origen es /root/ (a veces /home/root/, o sea, el directorio root que está dentro del
directorio home).
§ Los usuarios normales, como toni, que corresponden a las personas que trabajan con el sistema Linux y lo
utilizan para crear sus programas, documentos, etc. Su directorio origen es /home/toni/ (o el nombre de
usuario que toque).
§ Los usuarios especiales, como apache o ftp, que no corresponden a personas sino que ciertos programas los
utilizan para funcionar (Apache, el servidor de páginas web de Linux, funciona como si lo estuviera
ejecutando el usuario apache, etc.).

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.

Actividad 2. Directorios y ficheros


Ya habéis leído que los ficheros están en directorios, y que unos directorios están dentro de otros... así, ¿hasta
cuándo? Pues bien, hay un primer directorio, que los contiene a todos: el directorio raíz, representado por /.
De forma que /home/toni/ quiere decir, exactamente, el directorio toni, que está dentro del directorio home, que
está dentro del directorio /. Como veis, los nombres de directorio se terminan con / para distinguirlos de los
ficheros (por ejemplo: /home/toni/prueba podría ser un fichero, llamado prueba, dentro del directorio toni...).

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/).

pwd (print working directory, indica cuál es el directorio actual)


Como se dijo antes, esta orden muestra cuál es el directorio actual de forma absoluta.
$pwd # No hay que escribir $, representa el prompt
/home/toni/

ls (list, lista el contenido de un directorio)


Esta orden permite ver qué ficheros y directorios contiene un directorio. La forma más sencilla es escribir,
simplemente, ls, con lo que se mostrarán los contenidos del directorio actual (que, si no habéis hecho nada
raro, será vuestro directorio origen). Este comando muestra los nombres de los ficheros y los nombres de los
directorios (terminados en / y posiblemente de otro color).
Los comandos de Linux suelen tener opciones para modificar su comportamiento, que son palabras o letras con un
signo menos delante. Si queréis ver más información de cada elemento podéis escribir el comando con la
opción de listado largo: ls -l, con lo que obtendréis más información (tipo de entrada y permisos, número de
enlaces, propietario, grupo, tamaño en bytes, marca de tiempo (fecha y hora de la última modificación) y
nombre). Si aún no sabéis qué es todo esto tranquilos, ya lo veremos; basta con que recordéis que lo tenéis aquí
apuntado.

¿Cómo podéis ver el contenido de otros directorios?


§ Moviéndoos a otro directorio con el comando cd, que veremos enseguida.

2 Centre d’estudis politècnics 2002-2003


§ Mediante una ruta absoluta: indicando qué directorio queremos ver, especificándolo desde la raíz. Por
ejemplo, ls /home/ para ver qué hay en ese directorio.
§ Mediante una ruta relativa: indicando qué directorio queremos ver, pero especificándolo desde el actual. Por
ejemplo, ls tmp/ para ver qué hay en el directorio tmp, que está dentro de nuestro origen (no saldrá nada
porque está vacío).

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.

Un par de opciones más de ls (tras la # van los comentarios):


ls -d /etc/rc?.d # En vez de mostrar los contenidos de rc1.d/, rc2.d/,
muestra sólo sus nombres
ls -A # Muestra todos los ficheros, incluso los ocultos,
pero no ./ ni ../
ls -R # Lista recursivamente el directorio (o sea, también
los subdirectorios)

Éstas son las opciones más importantes del comando ls:


Opción Significado
-l Listado largo (muestra el tipo de fichero, los permisos, el número de
enlaces duros, el propietario, el grupo del fichero, el tamaño en
bytes, cuándo se ha modificado por última vez y el nombre).
-d Muestra sólo el nombre de los directorios, no sus contenidos.

Práctica 2 de redes de área local: El intérprete de comandos de Linux 3


-i Muestra el número de inodo de cada fichero.
-a Muestra los ficheros ocultos (los que empiezan por .).
-A Muestra los ficheros ocultos, pero no ./ ni ../
-R ls recursivo, recorre todos los subdirectorios que encuentra.
-r Invierte el orden de presentación.
-S Ordena por tamaño.
-t Ordena por fecha de modificación.
-h Muestra el tamaño de los ficheros en kilobytes y megabytes.
--help Muestra la ayuda de ls.

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.

cd (change directory, cambia el directorio actual)


Esta orden permite el movimiento por los directorios, por si queremos trabajar en un directorio distinto al origen.
Veamos algunos ejemplos, en los que hay que observar que se usan tanto rutas relativas como absolutas:
cd tmp/
cd /home/toni/tmp/
cd .. # Va al directorio padre
cd . # Se queda donde está
cd / # Va al directorio raíz
cd home/toni/ # Vuelve a /home/toni (desde /)

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.

mkdir (make directory, crea un directorio)


Cuando necesitemos organizar nuestra información deberemos crear nuevos directorios mediante esta orden. Si el
directorio actual es /home/toni/, podemos hacer:
mkdir pruebas/ # Crea /home/toni/pruebas/
mkdir scripts/ # Crea /home/toni/scripts/
mkdir pruebas/prác1/ # Crea /home/toni/pruebas/prác1/ . Si pruebas
no existiera se produciría un error. ¿Por qué?
mkdir -p pruebas/prác1/ # Crea los directorios intermedios si no
existen y al final prác1 (p es de parents,
padres)

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

4 Centre d’estudis politècnics 2002-2003


|-- administracion
|-- pruebas
`-- red

rmdir (remove directory, elimina directorio)


Borra el directorio que le indiquemos, que deberá estar vacío o de lo contrario dará error.
rmdir pruebas/ # Error si no está vacío
rmdir pruebas/prác1/ # Elimina prác1/
rmdir -p pruebas/prác1/ # Elimina prác1 y, si está vacío, también
pruebas/

7 Eliminad los directorios creados en el último ejercicio.


tree (muestra la estructura de directorios y ficheros en forma de árbol)
Para haceros una idea de la estructura de directorios y los ficheros que contienen, podéis utilizar el comando tree.
Si lo ejecutáis en la raíz le costará mucho mostrarlo todo; siempre podéis interrumpir un comando con Ctrl+C.

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.

Actividad 3. Obtención de ayuda


Trabajando con Linux hay tres formas principales de obtener ayuda: las opciones que dan los comandos (--help,
por ejemplo), el comando man y el comando info. Algunos comandos son más benévolos que otros y también
nos dan ayuda si los invocamos incorrectamente o sin ninguna opción, pero muchos son más antipáticos, así
que conviene conocer todas las herramientas disponibles.

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

Práctica 2 de redes de área local: El intérprete de comandos de Linux 5


apropos password
...
grpunconv [pwconv] (8) - convert to and from shadow passwords and groups
passwd (5) - password file
...
# En la ayuda de alguno de esos comandos explicará cómo hacerlo
man passwd
....

7 Utilizad apropos para descubrir información relacionada con los términos siguientes: Ethernet, ARP, telnet.

Actividad 4. Edición de ficheros de texto


vi (visual, editor de texto)
Aunque hay editores más cómodos, en Linux (y en los demás Unix) el editor estándar es vi (de visual, porque está
pensado para sistemas con pantalla, toda una novedad en su tiempo). A diferencia de los editores típicos (bloc
de notas, Word, etc.), en vi hay dos modos de funcionamiento:

→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.

vi # Se abre el editor con un fichero nuevo y en blanco


vi fich1 # Se abre vi con el fichero fich1; si ya existe se muestra
su contenido, y si no existe se crea vacío

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.

cat (concatenate, concatena ficheros y los muestra por pantalla)


Para ver el contenido de un fichero de texto podemos utilizar vi, pero si lo único que queremos hacer es ver qué
contiene hay un comando más cómodo:
cat texto1 # Muestra el fichero texto1 por pantalla
cat texto1 texto2 # Muestra texto1 y a continuación texto2

more (muestra un fichero página a página)


Si alguno de los ficheros es demasiado largo (probad a hacer cat /etc/passwd, que es el fichero que contiene la
lista de usuarios del sistema y sus datos) y no cabe en pantalla, podéis verlo completamente utilizando esta
orden, que muestra un fichero largo página a página; para pasar de una a otra tenéis que apretar una tecla, lo
que os da tiempo a leer lo que pone. Si apretáis q salís de more:
more /etc/passwd
more texto1

6 Centre d’estudis politècnics 2002-2003


less (more avanzado)
Igual que more, sólo que permite ir hacia arriba y hacia abajo con las flechas y resaltar una palabra escribiendo
/palabra. También se sale con q.

7 Visualizad /etc/passwd con less y resaltad la palabra root.

Actividad 5. Operaciones con ficheros


cp (copy, copia ficheros)
Este comando nos permite hacer copias de nuestros ficheros. Hay que entender que el original queda intacto,
simplemente se crea una copia, y si posteriormente modificamos o eliminamos la copia el original seguirá
igual. Veamos algunos ejemplos, suponiendo que en nuestro directorio origen tenemos los ficheros fich1 y
fich2 y el directorio prueba con los ficheros p1 y p2.
cp fich1 copia # Crea una copia de fich1 llamada copia en el
directorio origen (que es el actual)
cp fich1 prueba/copia # Crea otra copia, pero en prueba/, llamada
copia
cp fich1 prueba/ # Copia fich1 en prueba y la copia, al no
tener nombre, se llama también fich1
cp fich2 copia # Sobreescribe copia con el contenido de fich2
cp /etc/passwd . # Copia /etc/passwd al directorio actual (.)
# y, al no indicar un nombre, también se
# llamará passwd

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).

rm (remove, borra un fichero)


Borra un fichero o un conjunto de ficheros (si indicamos comodines). No borra directorios salvo con la opción -R.
rm fich1 # Borra fich1
rm prueba/fich1 # Borra el fich1 de prueba
rm * # Borra todos los ficheros del directorio actual
rm -R prueba/ # Borra el directorio prueba y todos sus contenidos

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)

Práctica 2 de redes de área local: El intérprete de comandos de Linux 7


Si queremos mover un fichero o directorio, o si simplemente queremos cambiarle el nombre, podemos utilizar esta
instrucción:
mv fich1 texto1 # Renombra fich1 a texto1
mv fich1 prueba/texto1 # Mueve fich1 a prueba y lo llama texto1
mv fich1 prueba/ # Mueve fich1 a prueba sin cambiarle el nombre
mv prueba/ cosas/ # Cambia prueba/ de nombre
mv prueba/ tmp/ # Como tmp ya existe, mete prueba/ dentro

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.

Actividad 6. Redireccionamiento de entrada y salida

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.

§ Si en vez de sobreescribir el fichero queréis añadirle la información al final, deberéis hacer:


ls --help >> ayudas
cp --help >> ayudas # Lo va añadiendo a lo que ya existe en ayudas
more ayudas

§ 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).

8 Centre d’estudis politècnics 2002-2003


7 Juntad los tres ficheros de ayuda del ejercicio anterior en uno solo, ayuda-linux.

Actividad 7. Filtros de texto


Estos programas sirven para filtrar según distintos criterios los resultados de otros comandos, y se suelen usar en
tuberías. Están pensados para trabajar con ficheros de texto.

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.

Hay varias formas de invocarlo:


ls /etc | grep z # La salida de ls es la entrada de grep
grep z fich1 # grep busca z en el fichero fich1
grep z # grep busca z en la entrada estándar (el teclado);
# va pidiendo texto y sólo repite las líneas que
# contengan al menos una z.

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.

Inciso: combinaciones de teclado especiales en Linux


Ctrl+C Interrumpir un comando.
Ctrl+D Señal de fin de fichero (EOF). Permite terminar la entrada por teclado.
Ctrl+Z “Duerme” el comando en ejecución (se verá en la práctica de administración del
sistema).

Sintaxis completa de grep:


grep [opciones] patrón [fichero(s)]

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.

Expresiones regulares en grep:


Símbolo Significado Ejemplo Resultado
Cadena caracteres La cadena aparece en la ro root:root...
línea. una tarjeta estropeada
que...
. Representa a cualquier prác. prác1.txt

Práctica 2 de redes de área local: El intérprete de comandos de Linux 9


carácter. prácb.txt
* El elemento precedente ro* root
puede estar cero, una o ramas tiernas
más veces. rooooom
[lista caracteres] Se puede elegir un carácter [xyz] bajo condiciones
cualquiera de la lista. extremas...
tarjeta de red y módem...
[^lista caracteres]Se puede elegir un carácter [^0123456789] (líneas sin números)
cualquiera que NO esté en
la lista.
[carácter-carácter] Se puede elegir un carácter [0-9] A partir de 100 usuarios...
cualquiera que esté entre (cualquier número)
los dos indicados.
^ Inicio de línea ^root root (a principio de línea)
$ Final de línea bash$ bash (a final de línea)
En todos estos ejercicios vamos a trabajar con el fichero /etc/passwd. Haceos una copia en vuestro directorio
origen.

Nota 1: campos de /etc/passwd


usuario:x:id de usuario:id de grupo:comentario:directorio origen:shell
Por ejemplo:
toni:x:511:501:/home/toni:Antonio Pérez:/bin/bash

7 Mostrad las líneas que contengan la palabra “bash”.


7 Mostrad las líneas que no empiecen con la letra g.
7 Mostrad las líneas que terminen con h o con e.
7 Mostrad las líneas que tengan al menos cuatro vocales.
7 Mostrad las líneas que tengan al menos dos vocales seguidas.
7 Mostrad las líneas que tengan al menos una q, sea minúscula o mayúscula (lo podéis hacer de dos formas).
7 Mostrad las líneas en las que no aparezca el texto “qmail”.
7 Mostrad las líneas que tengan alguna o que no esté precedida por una r.
7 Sabiendo que los números de usuario/grupo (UID/GID) están rodeados por “:”, mostrad las líneas que tengan
un UID o un GID de dos cifras.
7 ¿Sabríais modificar la orden anterior para que sólo mostrara los de UID de dos cifras, independientemente del
GID?
7 Sabiendo que el UID es el tercer campo, mostrad la línea de UID=1 (de forma que no sea posible que
aparezca otro usuario con UID=13, o uno con GID=312).
7 Almacenad en un fichero llamado usuarios todas las líneas correspondientes a usuarios normales, o sea, con
UID entre 501 y 999.
7 Mostrad las líneas que contengan alguna q pero no la palabra qmail. (Una forma de hacerlo es enlazar un grep
con otro.)
7 Poned en el fichero “especiales“ todas las líneas con los nombres de usuario root, bin o daemon (podéis
utilizar varias órdenes).

wc (word count, cuenta el número de palabras de un fichero)


La orden siguiente:
wc fich1
muestra, en este orden, el número de líneas, palabras y caracteres del fichero. Podemos pedirle que sólo muestre
algunas, con las opciones siguientes:

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

10 Centre d’estudis politècnics 2002-2003


7 Encontrad el número de líneas de vuestra copia de /etc/passwd.
7 Encontrad el número de líneas de ese fichero que contengan la palabra qmail. Hacedlo sólo con grep y luego
combinando grep y wc.

tail (muestra la cola de un fichero)


O sea, las últimas diez líneas:
tail fich # Últimas 10 líneas del fichero
tail -n3 fich # Últimas 3 líneas

head (muestra la cabeza de un fichero)


O sea, las diez primeras líneas:
head fich # Primeras 10 líneas
head -n3 fich # Primeras 3 líneas
head -c100 fich # Las líneas (enteras) que contienen los 100 primeros
# caracteres

Los comandos tail y head suelen utilizarse junto al siguiente, sort.


sort (ordena un fichero)
Importante: no es que ordene el fichero (que sigue intacto), sino que muestra su contenido de forma ordenada.
También hay que tener en cuenta que ordena según el código ASCII (números antes que letras, mayúsculas
antes que minúsculas, eñes, acentos, ces trencades al final, etc.)
sort /etc/passwd # Muestra el fichero ordenado por el primer elemento
(el nombre de usuario)

Sintaxis general (como es habitual, si se omite el fichero, ordena su entrada estándar):


sort [opciones] [fichero]

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

Veamos algunos ejemplos:


# Ordena el resultado de un ls por propietario
ls -l /var/ | sort -k3
# Fijaos en que si hay varias líneas del mismo propietario (root), sigue
# ordenando por los siguientes campos (primero por grupo, luego por
# tamaño, etc.).

# Ordena el resultado de un ls por propietario sólo; fijaos en la


# diferencia con el anterior:
ls -l /var/ | sort -k3,3

# Ordena /etc/passwd por nombre de usuario: el separador entre campos es


# “:”, y el nombre de usuario es el primer campo:
sort -t: -k1 /etc/passwd

Práctica 2 de redes de área local: El intérprete de comandos de Linux 11


7 Mostrad las líneas de /etc/passwd ordenándolas por UID.
7 Almacenad en un fichero los cincyo usuarios con mayor UID.
7 Mostrad los usuarios que tengan la palabra “qmail” en su campo de comentario ordenados por nombre de
usuario.
7A partir de un ls -l encontrad los diez ficheros de mayor tamaño del directorio /etc/ (no lo hagáis
manualmente, claro, escribid una orden que muestre sólo esos diez ficheros).

Actividad 8. Búsqueda de ficheros en el sistema


Antes de empezar, una advertencia: muchas de las opciones que encontraréis en el comando find no las podéis
entender aún, son necesarios muchos de los conceptos de la práctica tres. Para organizar mejor la información
se han incluido aquí todas las opciones importantes de find, pero veréis que los ejercicios correspondientes
están divididos en dos partes, los primeros tenéis que hacerlos ahora pero tendréis que hacer los del segundo
bloque cuando terminéis la práctica 3, para aplicar los conceptos que allí se explican.

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.

find: encuentra los ficheros que cumplan ciertas condiciones


La sintaxis general es la siguiente:
find [fichero(s)] [expresión(es)]

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).

Las expresiones pueden ser de cuatro tipos:


• Opciones: afectan al funcionamiento general de find
• Condiciones: devuelven V o F (verdadero o falso) en función de las características de cada fichero examinado
• Acciones: hacen algo y devuelven V o F. La acción por defecto es -print, que simplemente escribe el nombre
completo (ruta y nombre) del fichero por pantalla. Sólo se ejecutan si las condiciones previas dan como
resultado V.
• Operadores: permiten conectar condiciones. Simplemente son operadores lógicos para enriquecer aún más la
expresividad del comando

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/

12 Centre d’estudis politècnics 2002-2003


# Aplica -print, que es la acción por defecto, o sea, hace lo mismo que antes
find /home/laura/ -print

# 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

# Otras búsquedas más exóticas


find /usr/ -lname useradd # Muestra los enlaces simbólicos que apunten a
# useradd (saldrá adduser. Ya veremos qué son)
find /home/pablo/ -inum 615 # Muestra el fichero con inodo 615
# (simplificando un poco, bloque de disco 615)
find /etc/ -links 5 # Ficheros con 5 enlaces duros (también
# hablaremos de ellos)

# Búsquedas por tiempo (recordad que a es el de acceso, m el de modificación y


# c el de cambio de estado)
find -atime -4 # Ficheros accedidos en los últimos 4 días en todos los
# subdirectorios a partir del actual
find /etc/ -amin 30 # Ficheros accedidos hace justo 30 minutos
find /etc/ -amin -30 # Ficheros accedidos en la última media hora

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.).

# En principio no se pueden indicar fechas concretas, pero hay un truco


touch -t02010000 /tmp/fecha$$ # Crea un fichero temporal en 02/01 00:00
find /etc/ -newer /tmp/fecha$$ # Ficheros modificados después que fecha$$
rm -f /tmp/fecha$$ # Y borra el fichero temporal

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.

# Búsquedas por tamaño y alguna cosita más


find /home/laura -size 45k # Ficheros de tamaño igual a 45Kb
find /home/laura -size +45k # Ficheros mayores de 45Kb (más útil)
find /home/laura -size -500c # Tamaño menor a 500 bytes (caracteres)
find /home/laura -empty # Ficheros vacíos (tamaño 0)

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

Práctica 2 de redes de área local: El intérprete de comandos de Linux 13


# Propietarios y grupos
find /home/ -user pepito # Ficheros del usuario pepito
find /home/ -uid 500 # Ficheros con uid=500
find /home/ -uid -501 # Ficheros con uid<=500, mucho más interesante
find /home/ -nouser # Ficheros sin usuario (con ls sale un número,
# pero el usuario correspondiente ya no
# existe)

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:

# Ficheros de alguno de estos dos individuos


find /home/ -user pepito -or -user manolito

# No dará ningún fichero como resultado, porque un fichero no puede ser


# de pepito y de manolito a la vez (lo correcto es utilizar -or)
find /home/ -user pepito -and -user manolito

# Buena manera de ver qué canciones o ficheros sospechosamente grandes hay


# por ahí. Fijaos en el uso de paréntesis, que por cierto deben ir
# separados de los otros parámetros por un espacio y entre comillas
find /home/ “(“ -user pepito or -user manolito “)” -and “(“ -name *.mp3
-or -size +4000k “)”

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.

# Ficheros modificados en los últimos 3 días y que contienen la palabra


# ‘root’:
find /home/ -mtime -3 -exec grep -l root ‘{}’ ‘;’
# La idea es la siguiente: si se cumple -mtime -3, entonces ejecuta
# (-exec) el comando grep, que será el que muestre los nombres (opción de
# grep -l, que es una ele y no un uno y lo que hace es no mostrar las
# líneas sino sólo los nombres de los ficheros que contienen la palabra
# root) de los ficheros que le pase find (representados por el ‘{}’, ese
# símbolo se sustituye por el nombre de cada fichero que cumpla el
# -mtime 3). El ‘;’ termina el ámbito del -exec, lo que permite continuar
# el find si aún quedan ganas.

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:

# Nueva versión de lo anterior:


find /home/ -mtime -3 -exec grep root ‘{}’ ‘;’ -print
# Si el fichero contiene la palabra, -exec grep devuelve 0 y por tanto
# cumple la condición y su nombre se muestra por pantalla mediante -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

14 Centre d’estudis politècnics 2002-2003


Quizá parezca más complicado que lo anterior, pero resulta mucho más potente cuando las condiciones a evaluar
son complicadas o el comando a utilizar no es tan versátil como grep.

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.

Condiciones (los patrones con comodines deben ir entrecomillados)


Sintaxis Significado Ejemplo
-name patrón Devuelve V si el fichero se ajusta al patrón (que puede find /home/ -name “*.mp3”
contener ?, * y [abc...]). F en caso contrario.
-iname patrón Como el anterior, pero sin distinguir mayúsculas y find /home/ -iname práctica
minúsculas.
-lname patrón V si el fichero procesado es un enlace simbólico a un find / -lname useradd
fichero cuyo nombre se ajuste al patrón.
-ilname patrón Como el anterior, pero sin distinguir mayúsculas y find / -ilname script*
minúsculas.
-inum n V si el fichero está en el inodo n. find / -inum 332
-links n V si el fichero tiene n enlaces duros (admite +n y -n). find / -links +5
-atime n V si el fichero ha sido accedido n días antes. find /home/ -atime -100
Todas las condiciones -?time y -?min admiten +n y -n.
-ctime n V si su estado ha cambiado n días antes. find /home/ -ctime 3
-mtime n V si ha sido modificado n días antes. find /etc/ -mtime 10
-amin n V si ha sido accedido n minutos antes. find /etc/ -amin -50
-cmin n V si ha cambiado de estado n minutos antes.
-mmin n V si ha sido modificado n minutos antes. find /etc/ -mmin -100
-used n V si el fichero ha sido usado n días después de que su find /home/ -used 90
estado haya cambiado. Ayuda a encontrar ficheros que no
se usan. Admite +n y -n.
-size n V si el fichero tiene un tamaño n, donde n se puede find /home/ -size +5000k
escribir como (supongamos n=23): find / -size -10c
• 23: el fichero ocupa 10 bloques (de 512 bytes cada
uno)
• 23b: lo mismo que antes
• 23c: 23 bytes (caracteres)
• 23k: 23 Kbytes
• 23w: 23 palabras (2 bytes/palabra)
Admite +n y -n.
-empty V si el fichero está vacío find /home/ana/ -empty
-type x V si el fichero es de tipo x, que puede ser: find /etc/ -type l
• b: dispositivo de bloques (disco)
• c: dispositivo de caracteres (teclado)
• d: directorio
• p: tubería con nombre (named pipe o FIFO)
• f: fichero normal
• l: enlace simbólico
• s: socket (conexión por red a otro ordenador)
-user usuario V si el fichero pertenece al usuario. find -user manolito

Práctica 2 de redes de área local: El intérprete de comandos de Linux 15


-group grupo V si pertenece al grupo. find -group asi1t
-uid n V si pertenece al usuario de uid=n. find -uid 1 # uid=1 es root
-gid n V si pertenece al grupo de gid=n. find -gid -500
-nouser V si no pertenece a ningún usuario. find /home/ -nouser
-nogroup V si no pertenece a ningún grupo. find /home/ -nogroup
-perm modo Según cómo se indique el modo: find /home/pepe/ -perm +o+w
• -simbólico (con un - delante): V si tiene todos los find /home/pepe/ -perm -a+x
permisos indicados (puede tener más, pero al menos que find /home/pepe/ -perm 777
tenga esos)
• +simbólico: V si tiene alguno de los permisos
indicados (puede tener otros)
• Numérico: V si tiene exactamente esos permisos

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.

Ejercicios para la práctica 2:


7 Mostrad los ficheros de /etc/ modificados entre 2 y 10 días antes, que sean mayores de 10Kb y que no sean
directorios.
7 Borrad los ficheros de /tmp/ que estén vacíos y a los que no se haya accedido desde hace más de una semana.

16 Centre d’estudis politècnics 2002-2003


7 Buscad los ficheros que contengan el texto “root” o “admin”.
7 Cread un fichero que contenga los nombres de los ficheros mayores de 1Mb que no pertenezcan a root.
7 Encontrad los ficheros con extensión jpg o jpeg que ocupen más de 100 Kb.
Ejercicios para la práctica 3:
7 Encontrad los ficheros de root que tengan permisos de escritura para el grupo o los otros.
7 Encontrad los ficheros que no tengan ningún permiso para los otros.
7 Encontrad todos los ficheros sin propietario, sin grupo o del usuario luis.
7 Mostrad los ficheros creados el día 1/2/2002 por el usuario manuel (cambiad día y usuario para que os dé
algún resultado).
7 Encontrad los ficheros pertenecientes al usuario root o al grupo root que tengan los bits SetUId o SetGId.
7 Moved todos los ficheros ordinarios (no directorios ni otras cosas) de /home/ sin propietario al directorio
/tmp/revisar/.

xargs: ejecuta un comando sobre una serie de ficheros


Este comando se suele utilizar en combinación con find, para poder aplicar algún comando sobre los ficheros
encontrados. Básicamente se trata de un comando que aplica un comando sobre una lista de ficheros, que por
defecto le vienen por la entrada estándar. Típicamente se utiliza recogiendo como lista de ficheros la salida de
find:

# El directorio actual es /home/luis/


$find -name *.txt
/home/luis/prueba.txt
/home/luis/carta.txt

# Si en lugar de ver los nombres queremos ver el contenido de estos


ficheros,
$find -name *.txt | xargs cat
Este fichero es una prueba. # Contenido de prueba.txt
Hola, Ana, voy a ver si consigo # Contenido de carta.txt
encontrar mis gafas.

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

# Sin embargo wc -l aplicado a todos los ficheros a la vez además de


# mostrar el número de líneas de cada uno, mostrará el total de líneas de
# los tres:
$find -size -100c | xargs wc -l
3 ./prueba.txt
7 ./texto.txt
8 ./lista.txt
18 total

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

También podría gustarte