Está en la página 1de 64

1

Filesystem basics

Capítulo 1 Navegación del sistema de archivos

Conceptos clave

• El sistema de archivos de Linux es un "árbol invertido"de directorios y archivos con


un directorio raíz llamado "/".
• Todo proceso tiene un directorio actual de trabajo con frecuencia llamado "cwd".
• El comando pwd muestra el cwd de la shell bash.
• El comando cd cambia el cwd de la shell bash.
• Los archivos se pueden reseñar tanto por referencias absolutas como por referencias
relativas.

El árbol invertido del sistema de archivos

El concepto de un sistema de archivos organizado en directorios es común en muchos


sistemas informáticos. A un archivo individual se le asigna un nombre (un nombre de
archivo), y los nombres de archivo se organizan en un directorio (denominado como
directorio en algunos sistemas operativos). Sin embargo, los directorios son en sí mismos
un tipo de archivo para que también puedan ser recopilados en otros directorios. Este
proceso puede continuar, nivel tras nivel, hasta crear un entorno altamente estructurado.

Por ejemplo, la usuaria alice podría tener varias canciones almacenadas en archivos con
nombres como song1.midi y song2.midi. Estas canciones se podrían agrupar en un
directorio llamado songs. La usuaria alice también podría tener algunas fotos almacenadas
en los archivos picture1.png y picture2.png y a su vez, podría haberlos agrupado en un
directorio llamado photos. Los dos directorios songs y photos se pueden organizar en un
directorio llamado media. Este nuevo directorio puede ser uno de tantos en el directorio
website.

Una manera de visualizar esto es por medio de una estructura ramificada de árbol. El
directorio website puede contener los subdirectorios html, formsy media. Junto con los
directorios y los archivos nombrados anteriormente, este orden se puede bosquejar como
aparece en la gráfica 1-1.

Figure 1. Ejemplo de un árbol de directorios

-- html
|
website -- -- forms
|
| -- song1.midi
| |
| -- songs --
| | |
| | -- song2.midi
| |
2

Filesystem basics
-- media --
| -- picture1.png
| |
-- photos--
|
-- picture2.png

De la apariencia de ramificaciones de este diagrama es de donde surge la idea de árbol de


directorios. Por lo general se dibuja con las ramas hacia abajo y con la raíz del árbol en la
parte superior (website en este caso) y por lo tanto, se le llama estructura de directorio de
árbol invertido.

Linux utiliza un sólo árbol de directorios para toda su colección de archivos y directorios,
todas las ramas de una sola raíz "/" (léase como "barra oblicua") llamada directorio raíz.
Este árbol de directorios se puede ver, en parte, como se muestra en la gráfica 1-2.

Figure 2. Árbol de directorios iniciando en /

-- bin...
|
/ -- -- etc...
|
| -- mystuff...
| |
| -- alice --
| | |
| | -- website...
| |
-- home --
| | -- docs...
| | |
| -- elvis --
| |
| -- graphics...
...

Las elipses en el diagrama sugieren que hay muchos archivos y directorios que no se
muestran aquí. Por ejemplo, puede ver que el directorio website trazado anteriormente
puede adjuntarse para extender el diagrama. La característica más importante del diagrama
en este punto es la estructura arbórea que se desprende de / y no el contenido específico.

Al nombrar un archivo o directorio, comience desde la raíz del árbol del sistema de
archivos Linux y liste todas las ramas del directorio hasta el archivo o directorio deseado,
separando cada parte con una barra oblicua (/). Esto se conoce como el nombre
completamente calificado o FQN. Por ejemplo, el FQN del directorio website,
mencionado anteriormente, sería /home/alice/website. El archivo song1.midide la
usuaria alice se identificaría como /home/alice/website/songs/song1.midi. La cadena
de nombres de directorios que le llevan al nombre de archivo es la ruta del archivo. Este
tipo de nominación, ayuda a garantizar que cada archivo y directorio tenga un nombre
3

Filesystem basics

único completamente calificado. En la práctica real, los atajos y las suposiciones por
defecto se utilizan para simplificar el tecleado de los nombres de los archivos.

Exploración del árbol de directorios utilizando Nautilus

En el entorno gráfico X de Red Hat Enterprise Linux, los usuarios pueden utilizar Nautilus
como una herramienta sofisticada para navegar en el sistema de archivos. En el escritorio
de Red Hat Enterprise Linux, se puede abrir una ventana de Nautilus al hacer doble clic
(izquierdo) en el icono de inicio que se encuentra en la esquina superior izquierda.

Figure 1. Ventana Nautilus

Como una alternativa, usted puede utilizar el navegador Nautilus (puede ser más sencillo
para aquellos que han tenido contacto con lanzamientos previos de Red Hat Enterprise
Linux) al seleccionar el "navegador de archivos" desde el menú principal de Aplicaciones.
[1]

Figure 3. El navegador Nautilus

Para poder explorar el árbol de directorios utilizando Nautilus, primero tenemos que activar
el panel lateral de Nautilus. Esto puede hacerse seleccionando el "panel lateral" desde el
menú "ver".

Figure 4. Activación del panel lateral de Nautilus


4

Filesystem basics

La aplicación de panel lateral deNautilus se utiliza para diferentes propósitos. En este


momento, estamos interesados en explorar el árbol de directorios, así que seleccione
"árbol" en el panel lateral superior del menú.

Figure 5. Selección del panel lateral del árbol en Nautilus

El panel lateral de Nautilus le debe mostrar ahora la lista de directorios (carpetas) en forma
de árbol con el directorio superior llamado simplemente /. Un directorio se puede expandir
al hacer clic (en el botón izquierdo del ratón) en el triángulo al lado del icono de la carpeta.
Cuando haga click en el icono de la carpeta o en el nombre de carpeta, podrá ver el
contenido de la carpeta en el panel principal de Nautilus.

Figure 6. Exploración del árbol de directorios con Nautilus

Tenga en cuenta que cuando se selecciona un directorio particular para ver, la entrada de
"Buscar" que se encuentra justo arriba del panel principal, muestra una referencia absoluta
(FQN) para el directorio que se está viendo. Dedique un poco de tiempo para explorar el
sistema de archivos con Nautilus y para ver el contenido de varios directorios. Intente ver el
contenido del archivo /etc/sysconfig/network-scripts/ifcfg-lo, primero
seleccionando el directorio /etc/sysconfig/network-scripts en el panel lateral y
después, haciendo doble clic (en el botón izquierdo del ratón) en el icono ifcfg-lo en el
panel principal.

Ahora que ha dedicado un poco de tiempo explorando el concepto de árbol de directorios y


la forma como se construyen las referencias absolutas a los directorios y los archivos,
hablaremos un poco sobre algunos de los conceptos relacionados con el sistema de archivos
de Linux.

El directorio de trabajo actual (cwd)

A cada proceso Linux (por ejemplo,un programa o un comando) cuando se ejecuta, se le


asigna un directorio por defecto. Este directorio por defecto se utiliza para completar el
FQN para cualquier archivo cuyo nombre no se especifique como un FQN. Esto tiene dos
efectos. Primero, le permite al proceso referirse a los archivos de una manera más sencilla
sin tener que utilizar nombres demasiado largos. Segundo, le permite al proceso operar con
mayor flexibilidad ya que sus acciones dependen en parte del directorio por defecto. Si
cambia el directorio por defecto, la acción del proceso también cambiará. A este directorio
por defecto se le conoce como el directorio actual de trabajo ó cwd, para el proceso.
5

Filesystem basics

Un método común que puede utilizarse con los directorios es el considerar un directorio
como un lugar más que una cosa. Desde este punto de vista entonces el cwd para un
proceso se puede considerar como la ubicación actual de un proceso. Si un proceso cambia
de cwd entonces se ha movidode un directorio a otro. Esta manera de ver un directorio
como un "lugar" es tan común en el mundo de Linux que la palabra lugar es bastante
dominante en el lenguaje. Por ejemplo, los usuarios hablan de navegar el sistema de
archivos cuando se mueven de un directorio a otro.

En primer lugar, el padre del proceso que lo inicia le asigna un cwd al proceso. Sin
embargo, un proceso no está sujeto todo el tiempo a un determinado cwd cuando ejecuta.
Cuando sea necesario, un proceso puede cambiar su cwd a otro directorio antes de
continuar su trabajo.

¿En dónde estoy? El comando pwd

Uno de los procesos que se encuentra en ejecución en un sistema de Linux es la shell de


comandos. Si usted inicia la sesión en el sistema a través de una terminal virtual, o inicia un
programa de terminal en X, verá el intérprete de comandos en donde puede introducir
comandos para que el sistema actúe. Este intérprete de comandos es producido por la shell
de comandos, el cual es el proceso responsable de la lectura e interpretación de comandos.
Por defecto, la shell de comandos para los sistemas de Red Hat Enterprise Linux es la shell
de comandos bash (del inglés Bourne-again shell).

Como cualquier otro proceso, la shell bash se mantiene al tanto de su cwd mientras está
ejecutando. El directorio de trabajo actual afecta los comandos que usted escribe en el
intérprete de comandos y se convierte en su cwd mientras ejecutan. Básicamente entonces,
el cwd de la shell bash es su cwd, y puede considerarse como el lugar en donde usted se
encuentra dentro del sistema. Obviamente, es importante estar al tanto del cwd.
Afortunadamente, hay ayuda disponible. Primero, el mismo intérprete de comandos
muestra el último directorio de la ruta al cwd. Por ejemplo, la usuaria alice, al trabajar en su
directorio website, puede ver un intérprete de comandos como éste:

[alice$station website]$

El intérprete de comandos le recuerda que ha iniciado la sesión con el nombre de usuario


"alice" en la "estación," del computador y se encuentra en el directorio website. Pero
pueden haber otros directorios website en alguna otra parte del sistema. La ruta completa
(o absoluta) del directorio de trabajo actual se puede visualizar con el comando pwd (del
inglés print working directory).

Uso:

pwd
6

Filesystem basics

La usuaria alice quiere verificar si se encuentra en el directorio correcto. Podría utilizar


pwd.

[alice@station student]$ pwd


/home/alice/website

Cambio de sitio- El comando cd

Como se anotó anteriormente, los procesos pueden cambiar sus cwd cuando sea necesario.
Esto incluye la shell de comando bash, la cual proporciona el comando cd (del ingleś
change directory) para cambiar el directorio actual desde el intérprete de comandos.

Uso:

cd [DIRECTORIO]

Si no se especifica, DIRECTORIO utiliza por defecto el directorio de inicio del usuario.

Considere la siguiente secuencia de comandos:

[alice@station website]$ pwd


/home/alice/website
[alice@station website]$ cd /home
[alice@station home]$ pwd
/home
[alice@station home]$ cd /home/alice/website/songs
[alice@station songs]$ pwd
/home/alice/website/songs

Observe cómo cambia el resultado del comando pwd y la última parte del intérprete de
comandos para reflejar el nuevo cwd después de cada comando cd.

Puesto que navegar por los directorios es tan importante, hay abreviaturas especiales para
hacer referencia a ciertos directorios:

Table 1. Nombres de directorios especiales

Symbol Significado
. The current working directory
.. El directorio padre
~ The user's home directory
- El directorio de trabajo anterior

Las entradas en esta tabla requieren poca explicación. Primero, bash reconoce todos menos
el último nombre simbólico en la mayoría de los contextos, no sólo en el comando cd.
7

Filesystem basics

Segundo, el árbol de directorios se describe generalmente utilizando la analogía padre/hijo.


Si dir1 contiene a dir2, entonces se dice que dir2 es el directorio hijo de dir1 y que el
dir1 es eldirectorio padre del dir2. Por lo tanto, el directorio .. está a un nivel más cerca
de la raíz del árbol de lo que se encuentra el cwd. Después se le asigna un directorio de
inicio a cada cuenta de usuario, usualmente un subdirectorio de /home que coincide con su
nombre de usuario (este tema se explicará más detalladamente en el siguiente capítulo). El
directorio ~ representa ese directorio. Finalmente, la raya (-) es una opción especial del
comando cd que se refiere al directorio de trabajo anterior, facilitando el cambio entre
directorios hacia adelante y hacia atrás.

De nuevo, considere la siguiente secuencia de comandos:

[alice@station songs]$ pwd


/home/alice/website/songs
[alice@station songs]$ cd ~
[alice@station alice]$ pwd
/home/alice
[alice@station alice]$ cd -
[alice@station songs]$ pwd
/home/alice/website/songs
[alice@station songs]$ cd ..
[alice@station website]$ pwd
/home/alice/website
[alice@station website]$ cd
[alice@station alice]$ pwd
/home/alice

La última serie de comandos en el ejemplo anterior muestra que por defecto el comando cd
usa el directorio ~ si no se le asigna un directorio.

Referencias absolutas y relativas

Esta sección describe dos maneras de identificar la ubicación de un archivo. En esta


sección, como casi en cualquier otra parte de estas lecciones, es importante recordar que en
Linux un directorio es un tipo de archivo, así que todo lo que se diga sobre nominación de
archivos, también aplica a directorios y a archivos comunes de datos.

Para identificar un archivo, se debe proporcionar suficiente información para localizar el


archivo dentro del sistema de archivos. Esta ubicación se puede proporcionar de dos
maneras: como referencia absoluta(o ruta absoluta) o como referenciarelativa.

Las referencias absolutas inician con una barra oblicua (/) y asignan el FQN del archivo. Es
decir, la referencia absoluta nombra cada rama del árbol de directorio del sistema de
archivos, a partir de /, la cual se debe recorrer hasta llegar al archivo. Sin importar en dónde
se encuentre usted en el sistema de archivos, (en otras palabras, sin importar el valor del
cwd), una referencia absoluta identifica claramente el recurso específico. Ya hemos
discutido varios ejemplos de referencias absolutas en esta lección.
8

Filesystem basics

Una referencia relativa no describe la ruta al archivo desde /, sino que describe la ruta a
partir del directorio actual. Por ejemplo, si el cwd es /home/alice, entonces la referencia
relativa a song1.midi puede ser website/songs/song1.midi. Esta es una referencia
relativa ya que no comienza con /. Esta referencia sólo nombra los directorios que se deben
recorrer iniciando desde /home/alice, no desde /. Para que una referencia relativa sea
válida debe iniciar nombrando un directorio (o archivo) en el cwd.

Todos los directorios en Linux contienen dos entradas especiales, los directorios . y .., los
cuales representan el directorio actual y el directorio padre, respectivamente. Por lo tanto,
en la discusión previa acerca del comando cd, el ejemplo cd .. era en realidad sólo un uso
de una referencia relativa.

La tabla 1-2 muestra algunos ejemplos adicionales sobre referencias relativas. Cada uno de
estos es una referencia al archivo /home/alice/sample.txt con FQN. Algunos de estos
ejemplos son intencionalmente "ineficaces."

Table 1. Ejemplos de referencias relativas a /home/alice/sample.txt

cwd Referencia relativa


/home/alice sample.txt o ./sample.txt
/home/alice/website/songs ../../sample.txt
/home/elvis/docs ../../alice/sample.txt
/home alice/sample.txt
/home ../home/alice/website/../sample.txt

Sí, el último ejemplo es bastante tonto, pero es perfectamente válido.

Capítulo 2 Directorios importantes

Conceptos clave

• A toda cuenta de usuario se le asigna un directorio de inicio.


• El directorio /tmp se utiliza como espacio global para borradores.
• Los directorios /bin y /usr/bin comúnmente contienen archivos ejecutables.
• El directorio /etc contiene archivos de configuración del sistema.
• El directorio de inicio de /root, no se debe confundir con el directorio raíz del
sistema de archivos, /.

Esquema estándar de directorios de Linux


9

Filesystem basics

Linux se puede utilizar para soportar muchos tipos diferentes de sistemas informáticos:
servidores, estaciones de desarrollo, sistemas de escritorio personales, etc. Para poder
estandarizar la estructura del directorio del sistema de archivos a través de este variado
rango de sistemas, la mayoría de los sistemas Linux emplean un esquema de nominación y
utilización común que facilitan el uso y el mantenimiento de los sistemas. Al utilizar el
mismo tipo de diagrama arbóreo empleado en el último capítulo, parte de la primera capa
del árbol de directorios se vería así:

Figure 1. Árbol parcial de directorios iniciando en /

-- bin...
|
-- etc...
|
-- home...
|
-- root...
/ --|
-- sbin...
|
-- tmp...
| -- bin
-- usr --|
| -- sbin
-- var...

Este capítulo presenta una breve descripción (a veces muy breve) del papel de cada uno de
estos directorios.

El directorio de inicio del usuario

A cada usuario del sistema Linux se le asigna un directorio especial llamado su directorio
de inicio y representa su espacio "privado" en el sistema. Comúnmente éste es un
subdirectorio bajo el directorio /home, cuyo nombre coincide con el nombre de inicio de
sesión del usuario (se vieron varios ejemplos anteriormente /home/alice o /home/hogan).
La única excepción importante a esto es el superusuario (o el usuario root) cuyo directorio
de inicio usualmente es /root. Para cualquier usuario, el caracter (~) representa el FQN del
directorio de inicio del usuario cuando se utiliza como el primer caracter de una referencia
de archivo o directorio.

El propósito más obvio para el directorio de inicio de un usuario es brindar un espacio


privado para datos, un lugar en donde se pueden guardar archivos separados de los archivos
de otros usuarios. Normalmente, los usuarios son libres de crear subdirectorios bajo su
directorio de inicio y de organizar sus datos como les parezca (sujetos a las restricciones de
cuotas que deben haber). Dos usuarios diferentes pueden incluso asignar el mismo nombre
a archivos y directorios sin causar ningún conflicto ya que cada uno almacena en su propio
espacio. Por ejemplo, tanto Alice como Hogan pueden tener cada uno su subdirectorio
10

Filesystem basics

public_html, /home/alice/public_html y /home/hogan/public_html


respectivamente. El mantener el espacio de cada uno separado de los otros, ofrece también
más seguridad a los usuarios.

Otro aspecto importante del directorio de inicio de un usuario es que proporciona un lugar
para almacenar archivos de configuración específicos para cada usuario. Por ejemplo,
cuando Blondie inicia la sesión puede que necesite un entorno diferente al de Prince. Puede
que Blondie prefiera diferentes colores en su pantalla, diferentes atajos de comandos e
inclusive un entorno de escritorio de trabajo completamente diferente al de Prince. Los
archivos de configuración locales específicos para cada usuario hacen que esto sea posible.
Muchos de estos archivos de configuración se crean automáticamente por defecto cuando
se crea la cuenta de un usuario o al utilizar por primera vez un recurso en particular del
sistema.

Normalmente se le da a los usuarios un control relativamente completo sobre sus


directorios de inicio mientras que se les restringe el acceso al resto del sistema. Por
ejemplo, hay una gran probabilidad de que alice no pueda modificar o borrar ningún
archivo de configuración en el directorio /etc aunque es posible que sí pueda leerlos.
Además, es muy probable que no pueda leer, modificar o borrar ninguno de los archivos en
los directorios de los usuarios del sistema.

Cuando un usuario inicia sesión en el sistema por primera vez se le ubica "en" su directorio
de inicio, es decir, el sistema configura su directorio de inicio como su directorio de trabajo
inicial.

El directorio temporal /tmp

Además de su espacio personal en sus directorios de inicio, se le da acceso a los usuarios


para compartir espacio de "borrador", en el directorio /tmp. Un programa que necesite
almacenar datos comprimidos puede almacenar resultados parciales en /tmp, sólo poniendo
los resultados finales en el directorio de inicio del usuario cuando haya terminado de
hacerlo. Con frecuencia los sistemas Linux implementan cuotas en cuentas de usuarios para
prevenir que cualquier usuario consuma una proporción injusta del espacio disponible. El
directorio /tmp le da a todos los usuarios acceso a espacio adicional para cumplir con
necesidades a corto plazo sin cargar el espacio en su cuota. Esto es especialmente
importante, ya que los usuarios no siempre son conscientes de cuánto espacio extra necesita
un servicio y algunos servicios (tal como X) no pueden ejecutar si no hay espacio temporal
disponible de almacenamiento. Este espacio de borrador "global" se encuentra disponible
para todos los procesos en el sistema así como para todos los usuarios. El sistema borra
automáticamente los archivos puestos en este directorio después de unos días.

El directorio de configuración /etc

Una de las características únicas de un sistema Linux es su flexibilidad. Prácticamente todo


aspecto del sistema puede configurarse de alguna forma editando un archivo de
11

Filesystem basics

configuración. Estos archivos de configuración normalmente se colocan en /etc o en un


subdirectorio de /etc. Por ejemplo, el programa sendmail, a menudo utilizado para
ejecutar un servidor de correo, utiliza los archivos de configuración que se colocan en
/etc/mail. Los scripts de arranque del sistema se encuentran en /etc/rc.d, mientras que
los archivos de configuración de la red se encuentran en /etc/sysconfig. Obviamente, los
usuarios comunes no pueden modificar los archivos en /etc (o incluso leerlos, en algunos
casos), pero los administradores de sistemas invierten bastante de su tiempo trabajando con
los archivos almacenados aquí.

Los directorios de comandos /bin y /usr/bin

La mayoría de los comandos del sistema se encuentran almacenados como archivos


binarios en un formato legíble para la máquina. Los comandos apropiados para el uso de
usuarios comunes se suelen ubicar en los directorios binarios /bin o /usr/bin. Las
utilidades más importantes como ls, cd, cp, mv y el editor de texto vi, sin los cuales no se
podría usar el sistema van en /bin. Las utilidades adicionales como los compiladores, su
navegador de web y la suite de oficina van en /usr/bin, los cuales se pueden poner a
disposición de otros sistemas a través de la red. Considere /bin y /usr/bin como
directorios de comandos no privilegiados ya que no se necesitan privilegios especiales para
utilizar los comandos que se encuentran en ellos.

Considere /bin y /usr/bin como directorios de archivos no privilegiados puesto que no se


requieren privilegios especiales para utilizar los comandos que se encuentran en ellos.

Los directorios de comandos /sbin y /usr/sbin

Así como /bin y /usr/bin almacenan archivos de comando para usuarios comunes,
también /sbin y /usr/sbin almacenan archivos de comandos para que el superusuario
root los utilice. Estos incluyen comandos para adjuntar y quitar hardware, para iniciar y
detener el sistema y para realizar mantenimiento del sistema. Estos comandos privilegiados
también se encuentran almacenados en dos directorios separados por las mismas razones
que para /bin y /usr/bin.

El directorio "variable" /var

Las colecciones de comandos y de archivos de configuración que se encuentran en lugares


como /bin o /etc cambian muy poco día a día, si es que cambian del todo. Estos archivos
tienden a ser muy estables. Sin embargo, algunos archivos cambian con frecuencia. Estos
incluyen correo electrónico entrante y saliente, registros del sistema, sitios web, archivos
ftp y similares. Estos archivos y directorios con contenido variable suelen recopilarse en el
directorio /var. El colocar dichos archivos aquí hace más fácil asignarles espacio y
proteger los archivos más estables que se encuentran en alguna otra parte del sistema.

root vs./rootvs./ (la raíz del sistema de archivos)


12

Filesystem basics

Es un desafortunado accidente de la historia que el término raíz tenga un papel tan


importante y a la vez confuso en Linux. La raíz o el "root" en inglés, es el nombre de
usuario del superusuario, es decir, el usuario con autoridad suprema sobre el sistema.
También es el nombre del directorio de inicio de ese usuario, /root. Igualmente, es el
término que se utiliza para la base (¿la parte superior?) del árbol de directorios del sistema
de archivos, el directorio /. Normalmente, el significado del término se puede deducir del
contexto, pero una oración tal como el "directorio raíz" puede llegar a ser ambigua. Trate
de anticipar y de evitar tal confusión en su propia comunicación y busque aclaración si el
significado de la palabra no se puede deducir fácilmente del contexto.

Ejemplos

El directorio /tmp

Alice acaba de aprender que algunos de los procesos utilizan automáticamente /tmp como
espacio de borrador y quiere ver si algo de lo que ha hecho ha utilizado ese espacio.
También quiere probar si realmente puede crear archivos allí.

Para crear un archivo, Alice utilizará el comando touch.

[alice@station alice]$ cd /tmp


[alice@station tmp]$ ls
orbit-alice ssh-XXDg4ke3
[alice@station tmp]$ ls -l
total 8
drwx------ 2 alice alice 4096 Mar 16 08:04 orbit-alice
drwx------ 2 alice alice 4096 Mar 16 07:07 ssh-XXDg4ke3
[alice@station tmp]$ touch newfile
[alice@station tmp]$ ls -l
total 8
-rw-rw-r-- 1 alice alice 0 Mar 16 14:14 newfile
drwx------ 2 alice alice 4096 Mar 16 08:04 orbit-alice
drwx------ 2 alice alice 4096 Mar 16 07:07 ssh-XXDg4ke3
Después de cambiar a /tmp, Alice usa ls y ls -l para ver el contenido del directorio
/tmp. Aunque ls -l produce un listado largo, ella no está segura y ve su nombre de
usuario tantas veces que se convence de que algunos programas que ejecutó dejaron
archivos en /tmp, como le habían dicho antes. De hecho, tanto orbit-alice como
ssh-XXDg4ke3 fueron colocados allí cuando ella inició su entorno de escritorio.
Alice utiliza el comando touch para crear un nuevo archivo vacío llamado newfile
en /tmp. Como muchos de los comandos Linux cuando touch lo logra, lo hace de
manera silenciosa (sin ningun aviso en la pantalla). Alice verifica que touch sí
funcionó con otro ls -l.

Búsqueda de comandos en /bin y /usr/bin


13

Filesystem basics

Hogan quiere ver si algunos de los comandos comunes que utiliza se encuentran en alguno
de los directorios de los comandos binarios /bin o /usr/bin. Decide probar cp, mozilla,
cd y fdisk.

Hogan puede utilizar ls para buscar estos comandos, pero en su lugar quiere probar un
nuevo comando, which.

Uso sencillo:

which PROGRAM

Muestra el FQN del archivo del comando PROGRAM que se utilizará si el usuario ejecuta
el comando.

[hogan@station hogan]$ which cp


/bin/cp

[hogan@station hogan]$ which mozilla


/usr/bin/mozilla

[hogan@station hogan]$ which cd


/usr/bin/which: no cd in
(/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/hoga
n/bin:)

[hogan@station hogan]$ which fdisk


/usr/bin/which: no fdisk in
(/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/h
ogan/bin:)
[hogan@station hogan]$ ls /sbin
...
ether-wake ldconfig portmap usbmodules
extendfs lilo poweroff vboxd
fdisk logdump pppoe
vgcfgbackup
...
Hogan ve que cp se encuentra en el directorio /bin, lo cual le parece posible ya que
los archivos en /bin son los archivos que los usuarios normales desearían que
siempre estuvieran presentes en el sistema.
Hogan encuentra mozilla (el navegador que escogió) en /usr/bin. Esto también
parece estar bien ya que los archivos en /usr/bin son archivos que un usuario
normal podría querer que no siempre estuviesen disponibles.
Hogan está sorprendido de los resultados de cd, lo cual parece decir que el comando
cd no está en el sistema. Estaba esperando ver una respuesta como /bin/cd. (¿Por
qué?) Lo que Hogan no sabe es que cd es un ejemplo de un comando interno,
provisto por el comando de la shell bash. Por otro lado, si revisara, encontraría bash
14

Filesystem basics

en /bin.
Hogan también está sorprendido de los resultados de fdisk. Sabe que es un comando
importante, pero peligroso, utilizado para particionar discos y sólo debe estar
disponible para el superusuario así que estaba esperando una respuesta de /sbin.
Incluso puede ver fdisk en /sbin cuando lo examina utilizando ls. Al mirarlo más
detenidamente, descubre que which ni siquiera buscó fdisk en /sbin. Después Hogan
aprenderá sobre la ruta de comandos y descubrirá el porqué esto tiene perfecto
sentido.

Ejercicios en línea

Exploración de directorios importantes

Lab Exercise
Objetivo: Explore algunas de las características de los directorios importantes
discutidas en este capítulo.

Tiempo estimado: 15 minutos.

Configuración

En este ejercicio necesitará utilizar touch para crear archivos. Este comando se demostró en
los ejemplos de este capítulo. Necesitará utilizar which para ubicar los archivos de
comando. Este comando también se demostró en los ejemplos.

Especificaciones

1. Abra una nueva terminal o una nueva consola virtual (esto se necesita para la
evaluación de su trabajo en línea).

Quiere probar si en realidad puede utilizar touch para crear archivos en varios
directorios. Espera que esto funcione en su directorio de inicio y en /tmp, pero no
en otros directorios. Use el comando touch newfile.username (en donde el
username se remplaza con su nombre de usuario) en cada uno de los siguientes
directorios.

a. ~
b. /tmp
c. /bin
d. /root

Claramente, cabe esperar que algunos de sus esfuerzos no den resultado. Regrese a
su directorio de inicio cuando haya terminado.
15

Filesystem basics

2. Utilizando which, determine el FQN del archivo del comando binario para cada uno
de los siguientes: pwd, ls y whoami. Ejecute cada uno de estos comandos de
manera "cruda" utilizando el FQN en el intérprete de comandos. Finalmente, ejecute
exit, salga de la terminal o de la consola virtual.

Cuando haya terminado, salga de su shell para que se guarde la historia de sus comandos en
el archivo ~/.bash_history.

Deliverables

Question 1

1. Dos archivos llamados ~/newfile.username y /tmp/newfile.username, en


donde username es su nombre de cuenta primaria.
2. Un archivo ~/.bash_history que contiene un registro de sus comandos.

Possible Solution

La siguiente secuencia de comandos demuestra el uso de which y touch, y la ejecución de


un comando utilizando su referencia absoluta.

[student@station student]$ touch /tmp/newfile.student


[student@station student]$ which pwd
/bin/pwd
[student@station student]$ /bin/pwd
/home/student

Capítulo 3 Administración de archivos

Conceptos clave

• Se pueden crear archivos (o agregar) de una manera fácil utilizando el


redireccionamiento de la shell.
• El comando cp copia archivos.
• El comando mv mueve archivos.
• El comando rm borra archivos.
• Los archivos pueden ser "sobrescritos" como resultado de redireccionar, mover o
copiar.
16

Filesystem basics

Redirección

Muchos de los comandos producen salidas “visibles”. Normalmente, la salida se mostrará


en la pantalla. Por ejemplo, observe la salida de pwd para Julius:

[julius@station julius]$ pwd


/home/julius
[julius@station julius]$

A Linux le gusta pensar que todo es un archivo. En el ejemplo anterior, pwd envió la salida
al archivo de salida estándar, o STDOUT, el cual es por defecto la pantalla para los usuarios
que han iniciado sesión en el sistema.

Una de las características de la shell de comandos bash es que la salida que normalmente es
dirigida a la pantalla a través de STDOUT, también puede ser redireccionada a algún otro
archivo. Esto se hace utilizando el símbolo especial de redireccionamiento, , como se
muestra en este ejemplo:

[julius@station julius]$ ls
[julius@station julius]$ pwd > results.txt
[julius@station julius]$ ls
results.txt

En este ejemplo, los resultados usuales del comando fueron dirigidos al archivo
results.txt, creando el archivo durante el proceso. Un comando útil que nos puede servir
para verificar lo que ha pasado es el comando cat (concatenar).

Uso:

cat [OPCIONES] [ARCHIVO...]

ConcatenarARCHIVO(s) a la salida estándar.

El comando cat copia cada uno de los archivos listados a la salida estándar. Si se lista más
de un archivo, esto concatena efectivamente los archivos. Como para cualquier otro
comando, esta salida se mostrará en la pantalla por defecto, pero también se puede
redireccionar a un archivo. Lo utilizaremos para mostrar un archivo nombrando un sólo
archivo y no redireccionando los resultados.

[julius@station julius]$ pwd > results.txt


[julius@station julius]$ ls
results.txt
[julius@station julius]$ cat results.txt
/home/julius

Esta vez, Julius capturó la salida de pwd redireccionando los resultados a results.txt y
después mostró results.txt con cat.
17

Filesystem basics

Si el archivo ya existe, el redireccionamiento borrará y re-creará el archivo vacío y luego


capturará la nueva salida. Sin embargo, si se utiliza un doble símbolo (>>) la nueva salida
se añadirá al archivo. Si se utiliza >> y el archivo destino no existe, éste se crea como si se
hubiese utilizado >. El símbolo > es un ejemplo de un meta-caracter de shell, es decir, un
símbolo con significado especial que la shell bash ve e interpreta antes de actuar sobre el
resto del comando. Hay muchos de éstos como veremos en las próximas lecciones y todos
requieren atención.

El comando más sencillo de todos que produce una salida visible es echo. El comando echo
toma cualquier texto que se teclee como parte del comando y lo repite a la salida estándar
(usualmente la pantalla). Este comando sencillo junto con el redireccionamiento, se puede
utilizar para crear archivos de texto.

Uso:

echo [OPCIONES] [STRING...]

Repite la cadena de caracteres en la salida estándar.

Example 1:

[julius@station julius]$ echo Hello > greetings.txt


[julius@station julius]$ echo How are you >> greetings.txt
[julius@station julius]$ cat greetings.txt
Hello
How are you

Ejemplo 2:

[julius@station julius]$ ls
[julius@station julius]$ pwd > results.txt
[julius@station julius]$ cat results.txt
/home/julius
[julius@station julius]$ ls >> results.txt
[julius@station julius]$ cat results.txt
/home/julius
results.txt

Copie archivos con cp

Se pueden crear duplicados de archivos con el comando cp (del inglés copy).

Uso:

cp [OPCIONES] {FUENTE} {DESTINO}

cp [OPCIONES] {FUENTE...} {DIRECTORIO}


18

Filesystem basics

De la primera manera, se hace una copia del archivo FUENTE como DESTINO. De la segunda
manera, se pueden copiar uno o más archivos al mismo tiempo a un directorio. Se hace una
copia del archivo FUENTE, ..., en el DIRECTORIO y se nombra DIRECTORIO/FUENTE, .... Con
las opciones apropiadas (no se discutirán aquí - intente man cp), puede copiar árboles de
subdirectorios completos de una sola vez.

Ejemplos:

1. Haga una copia de mysong.midi y nombre la copia backup.midi:

cp mysong.midi backup.midi

2. Haga una copia de mynovel.txt en /tmp:

cp mynovel.txt /tmp

El archivo resultante se llamará /tmp/mynovel.txt.

3. Copie los archivos songs.tar y novels.tgz en el directorio /tmp:

cp songs.tar novels.tgz /tmp

Nombre los archivos resultantes /tmp/songs.tar y /tmp/novels.tgz.

4. Haga una copia de webpage.html desde su directorio de inicio a su directorio


actual:

cp ~/webpage.html .

El archivo resultante se llamará ./webpage.html.

Mueva/renombre archivos con mv

Puede mover archivos de un directorio a otro o de un nombre a otro (renombrarlos) con el


comando mv (mover).

Uso:

mv [OPCION...] {FUENTE} {DESTINO}

mv [OPCION...] {FUENTE...} {DIRECTORIO}

. En la primera forma, el archivo FUENTE es renombrado como DESTINO. De la segunda


forma, uno o más archivos pueden ser movidos a un directorio al mismo tiempo. Los
19

Filesystem basics

archivos FUENTE, ..., se mueven al DIRECTORIO y se nombran DIRECTORIO/FUENTE, ....


FUENTE puede ser un directorio, en tal caso el directorio se mueove o se renombra.

El comando mv es particularmente interesante , pues la manera en que funciona encierra un


hecho crítico sobre los sistemas de archivos Linux: Linux trata el nombre de archivo como
algo completamente diferente del contenido del archivo. Aunque el comando mv proviene
de la palabra "mover," de hecho mv raras veces mueve datos. En su lugar, el sistema de
archivos simplemente graba un cambio de nombre. Si el nombre cambia de
/somedir/somefile a /somedir/newname, vemos esto como una "renombramiento" del
archivo. Si el nombre cambia de /somedir/somefile a /newdir/somename, vemos esto
como "mover" el archivo. Si el nombre cambia de /somedir/somefile a
/newdir/newname, vemos esto como un cambio doble, mover y renombrar. Pero para
Linux todos estos son la misma cosa, un cambio en el FQN del archivo.

Ejemplos:

1. Renombre mysong.midi como backup.midi:

mv mysong.midi backup.midi

2. Mueva mynovel.txt a /tmp:

mv mynovel.txt /tmp

El archivo resultante se llamará /tmp/mynovel.txt.

3. Mueva songs.tar y novels.tgz a /tmp:

mv songs.tar novels.tgz /tmp

Nombre los archivos resultantes /tmp/songs.tar y /tmp/novels.tgz.

4. Mueva webpage.html de su directorio de inicio al directorio de trabajo actual:

mv ~/webpage.html .

El archivo resultante se llamará ./webpage.html.

5. Renombre el subdirectorio html del directorio actual de trabajo a public_html:

mv html public_html

Renombra ./html como ./public_html, asumiendo que ./public_html no existe


de antemano - vea el siguiente ejemplo.
20

Filesystem basics

6. Su cwd es su directorio de inicio. Tiene dos subdirectorios ~/images y ~/html.


Mueva el directorio images al directorio html:

mv images html

El directorio resultante se llamará ~/html/images. Observe la similitud entre este


ejemplo y el anterior. La diferencia crítica es que en este caso el directorio destino
~/html ya existía, asi que mv movió el directorio fuente dentro (bajo) el directorio
destino. En el ejemplo anterior, el directorio destino no existía aún, así que mv
renombró el directorio fuente con el nuevo nombre.

Suprima (borre) archivos con rm

Se pueden suprimir (eliminar, borrar) archivos con el comando rm (remover).

Uso:

rm [OPCIONES] {ARCHIVO...}

Suprime el (los) ARCHIVO(s) del sistema de archivos. Técnicamente, desenlaza el (los)


ARCHIVO(s), una diferencia que se aclarará más adelante. Con las opciones apropiadas (no
discutidas aquí - intente ejecutar man rm) se pueden borrar árboles de subdirectorios de
una sola vez.

Note
rm no puede borrar un directorio a menos de que se utilicen opciones especiales del
comando. Hay un comando especial para este propósito: rmdir.
Warning
Sí, el comando rm puede suprimir árboles enteros de directorios de una sola vez. En
las manos del susperusuario puede borrar el contenido completo de un sistema de
archivos -- no siempre es lo que se pretende hacer.
Warning
La documentación para rm incluye la siguiente frase: "Observe que si utiliza rm para
suprimir un archivo, usualmente es posible recuperar el contenido de ese archivo."
Aunque esto pueda ser verdad requiere un nivel de habilidad más allá del proposito de
este curso, así que para todos los propósitos prácticos, debe tratar este comando como
si no fuese reversible.

Ejemplos:

1. Borrar mysong.midi:

rm mysong.midi
21

Filesystem basics

2. Borre songs.tar y novels.tgz:

rm songs.tar novels.tgz

3. Borre photos.html de su directorio de inicio:

rm ~/photos.html

Sobrescribir archivos (¡uy!)

Algunas de las advertencias incluídas en la sección anterior insinúan algunos de los


comandos potencialmente peligrosos como cp, mv y rm. Infortunadamente, aunque por lo
general, mientras vemos pasar las corrientes del rio, con frecuencia olvidamos las rocas que
se encuentran bajo el agua y Linux también es el mismo caso. Este es el precio que hay que
pagar por el poder de un sistema operativo como Linux. En esta sección resaltamos uno de
esos peligros: sobrescribir archivos.

La redirección de comandos con > y los comandos cp y mv, pueden nombrar los archivos
destino. Normalmente, estos son nombres de archivos nuevos y los comandos crean los
archivos. Pero si se nombra un archivo existente como destino de la redirección, cp o mv,
el archivo existente será destruido sin advertencia. Esto se conoce como sobrescribir un
archivo. Puesto que este problema puede llegar a ser tan sorprendentemente sutil para un
nuevo usuario, le vamos a mostrar varios ejemplos.

Ejemplo 3:

[julius@station julius]$ pwd > file1


[julius@station julius]$ cat file1
/home/julius
[julius@station julius]$ ls > file1
[julius@station julius]$ cat file1
mycwd

Aquí no hay muchas sorpresas si ha puesto atención -- simplemente observe la manera en


que la segunda redirección remplazó el contenido anterior de file1 sin ningún mensaje de
advertencia. El archivo file1 se ha sobrescrito.

Ejemplo 4:

[julius@station julius]$ touch file1


[julius@station julius]$ ls
file1
[julius@station julius]$ pwd > file2
[julius@station julius]$ ls
file1 file2
[julius@station julius]$ cat file2
/home/julius
22

Filesystem basics
[julius@station julius]$ mv file2 file1
[julius@station julius]$ ls
file1
[julius@station julius]$ cat file1
/home/julius

Aquí tampoco hay sorpresas -- observe como mv remplazó el contenido previo de file1
sin ninguna advertencia. De nuevo, file1 ha sido sobrescrito. cp habría remplazado file1
de la misma manera.

Para poder entender completamente nuestro último ejemplo, necesitamos aprender un poco
más acerca de redireccionamiento. En particular, necesitamos aprender cuándo se sucede la
redirección.

Ejemplo 5:

[julius@station julius]$ touch file1


[julius@station julius]$ ls
file1
[julius@station julius]$ ls > file2
[julius@station julius]$ ls
file1 file2
[julius@station julius]$ cat file2
file1 file2

¿Por qué file2 lista file1 y file2, cuando el primer ls sólo muestra file1? Respuesta:
debido a la secuencia en que tuvieron lugar los pasos críticos. Evento 1: bash vio la
redirección al archivo file2 y lo creó como un archivo vacio (vea la discusión anterior
sobre redireccionamiento). Evento 2: ls generó un listado de archivos mostrando el archivo
creado anteriormente file1 y el que se acaba de crear file2. Evento 3: la salida de ls se
envió a file2.

Ejemplo 6:

[julius@station julius]$ pwd > mycwd


[julius@station julius]$ cat mycwd
/home/julius
[julius@station julius]$ cp mycwd mycwd
cp: `mycwd' and `mycwd' are the same file
[julius@station julius]$ cat mycwd
/home/julius
[julius@station julius]$ cat mycwd > mycwd
cat: mycwd: input file is output file
[julius@station julius]$ cat mycwd
[julius@station julius]$

Esto necesita una explicación. Primero, Julius crea mycwd usando pwd y presenta su
contenido con cat. Después utiliza cp para tratar de copiar el archivo a sí mismo pero cp
detecta el "error," muestra un mensaje y no hace nada (mv hubiese hecho lo mismo). El cat
23

Filesystem basics

en la línea siguiente verifica que mycwd no ha tenido cambios. Está bien hasta ahora. Sin
embargo, la siguiente secuencia produce una gran sorpresa. Julius usa cat con
redireccionamiento para tratar de copiar un archivo a sí mismo. cat también se queja de los
archivos fuente (entrada) y del destino (salida) al ser el mismo y pareciese que no hace
nada. Pero el cat final de mycwd no produce ninguna respuesta -- ¡el contenido del archivo
se perdio! ¿Por qué? Debido a la secuencia en la que tuvieron lugar los eventos. Evento 1:
bash ve la redirección a un archivo que ya existe, borra el archivo y lo re-crea vacío (vea la
discusión anterior sobre redirección) -- mycwd es sobrescrito. Evento 2: ya no importa lo
que cat haga puesto que el archivo fuente mycwd ya ha sido destruído y re-creado. Es
demasiado tarde para evitar el error.

Existen algunas pocas opciones de comandos y características especiales de la shell de


comando que se pueden utilizar para mitigar este comportamiento de alguna manera, pero
el objetivo de este capítulo simplemente es aprender cómo funcionan estos comandos y en
esta sección específicamente, la manera como funcionan en archivos existentes. Esta es una
característica no un error que necesario entender y utilizar de manera correcta.

Ejemplos

Mover/Archivar un sitio web simple

Madonna intentó configurar un sitio web personal simple, pero después de terminar su ISP
le dijo que había puesto todos los archivos del sitio web en un directorio equivocado. Puso
los archivos en ~/html y debieron haber sido puestos en ~/public_html. Necesita mover
los archivos al directorio correcto. Mientras lo hace, también necesita hacer una copia de
seguridad de los archivos que se encuentran en el directorio archive, por si acaso daña o
borra accidentalmente uno de los archivos en ~/public_html. El directorio archive ya
existe.

[madonna@station madonna]$ ls
html archive
[madonna@station madonna]$ mv html public_html
[madonna@station madonna]$ cd public_html
[madonna@station public_html]$ ls
index.html photo.jpeg
[madonna@station madonna]$ cp index.html photo.jpeg ../archive

Para mover los archivos todo lo que Madonna tuvo que hacer fue renombrar el directorio.
Para hacer copias de seguridad utilizó la habilidad del comando cp para copiar más de un
archivo a la vez.

Mover un sitio web simple

Nero intentó configurar un sitio web personal simple, pero después de terminar su
proveedor de servicios de internet (ISP por sus siglas en inglés) le dijo que habia puesto
todos los archivos del sitio web en el directorio equivocado. Puso los archivos en su
24

Filesystem basics

directorio de inicio y deben estar en ~/public_html. Necesita mover los archivos al


directorio correcto. Su problema es más complicado que el de Madonna, puesto que no
puede renombrar un subdirectorio simplemente. El directorio public_html fue creado por
su ISP.

[nero@station nero]$ ls
index.html photo1.jpeg photo2.jpeg public_html
[nero@station nero]$ mv index.html photo1.jpeg photo2.jpeg public_html
[nero@station nero]$ ls
public_html
[nero@station nero]$ cd public_html
[nero@station public_html]$ ls
index.html photo1.jpeg photo2.jpeg

Para mover los archivos Nero utilizó la habilidad del comando mv para mover más de un
archivo a la vez.

Suprimir robots.txt

Elvis nota un archivo en su directorio ~/public_html que no reconoce, un archivo llamado


robots.txt. Decide borrarlo.

[elvis@station elvis]$ ls
public_html
[elvis@station elvis]$ ls public_html
index.html robots.txt
[elvis@station elvis]$ rm public_html/robots.txt
[elvis@station elvis]$ ls public_html
index.html

Ejercicios en línea

Crear un sitio web

Lab Exercise
Objetivo: Utilizar la redirección, cp y mv para crear un sitio web simple y archivar el
sitio web.

Tiempo estimado: 15 minutos.

Configuración

En este ejercicio necesitará trabajar con los directorios ~/html y ~/archive. Inicie sesión
con su cuenta y utilice los siguientes comandos para crear estos dos directorios:
25

Filesystem basics
[student@station student]$ mkdir ~/html
[student@station student]$ mkdir ~/archive

Especificaciones

Quiere crear un sitio web personal simple utilizando las técnicas que se demostraron en la
sección de ejemplos de este capítulo.

1. Cree una página web "en construcción" en ~/index.html.


2. Mueva este archivo a ~/html.
3. Renombre el directorio html como public_html.
4. Haga una copia de su archivo index.html en ~/archive.

Note
La página web resultante puede ser o no visible con un navegador, dependiendo de las
características adicionales de la configuración de su sistema. Su instructor le dirá si
puede ver los resultados de su trabajo de este modo.

Deliverables

Question 1

1. Dos archivos ~/public_html/index.html y ~/archive/index.html, cada uno de


los cuales tiene un contenido idéntico (el texto "en construcción" posiblemente con
una etiqueta HTML).

Possible Solution

The following sequence of commands provides one possible solution to this exercise.

[student@station student]$ mkdir html archive


[student@station student]$ echo '<h1>' > index.html
[student@station student]$ echo 'Under construction' >> index.html
[student@station student]$ echo '</h1>' >> index.html
[student@station student]$ mv index.html html
[student@station student]$ mv html public_html
[student@station student]$ cp public_html/index.html archive
[student@station student]$ ls public_html
index.html
[student@station student]$ ls archive
index.html

Investigar la opción "noclobber"


26

Filesystem basics

Lab Exercise
Objetivo: Investigar las consecuencias de la opción bash "noclobber".

Estimated Time: 10 mins.

Especificaciones

Desea investigar las consecuencias del sobrescribir archivos y de la opción bash


"noclobber".

1. Abra una nueva terminal o una nueva consola virtual (esto se necesita para la
evaluación de su trabajo en línea).
2. Cree un archivo llamado source que incluya la palabra "fuente" y un archivo
llamado target que incluya la palabra "destino."
3. Use cp para sobrescribir target con source. Verifique el efecto con cat.
4. Re-cree target.
5. Sobrescriba target de nuevo haciendo cat en source y redireccionando la salida.
Verifique los resultados.
6. Active la opción bash "noclobber" con el siguiente comando mágico:
7. [student@station student]$ set -o noclobber
8. Ensaye de nuevo ambos tipos de sobrescritura y observe los resultados.
9. Desactive la opción bash "noclobber" con el siguiente comando mágico:
10. [student@station student]$ set +o noclobber
11. Termine la sesión en la terminal o en la consola virtual.

Deliverables

Question 1

1. Un archivo ~/.bash_history que tiene el récord de sus opciones de activación y


desactivación de la opción noclobber.

Possible Solution

The following sequence of commands provides one possible solution to this exercise.

[student@station student]$ echo source > source


[student@station student]$ echo target > target

[student@station student]$ cp source target


[student@station student]$ cat target
source
27

Filesystem basics

[student@station student]$ echo target > target


[student@station student]$ cat source > target
[student@station student]$ cat target
source
[student@station student]$ echo target > target

[student@station student]$ set -o noclobber


[student@station student]$ cp source target
[student@station student]$ cat target
source

[student@station student]$ echo target > target


[student@station student]$ cat source > target
-bash: target: cannot overwrite existing file

[student@station student]$ set +o noclobber


[student@station student]$ exit

Capítulo 4 Administración de directorios

Conceptos clave

• Se puede examinar el contenido de árboles de directorios completos con el comando


ls -R.
• El comando mkdir crea directorios.
• El comando rmdir borra directorios (vacíos).
• cp -r copia directorios recursivamente.
• rm -r suprime directorios recursivamente.

Creación de directorios (nuevos, vacíos): mkdir

La organización de archivos dentro de directorios requiere la habilidad para crear los


directorios que necesita. En Linux, el comando para hacer un directorio nuevo es el
comando mkdir (del inglés make directory).

Uso:

mkdir [OPCIONES] {DIRECTORIO...}

Crea el(los) DIRECTORIO(s) si no existe(n). Falla y emite un mensaje de error si uno o


más de los DIRECTORIO(s) existen, pero los nuevos directorios restantes son aún creados.

Para crear un subdirectorio ~/public_html Elvis puede proceder así:

[elvis@station elvis]$ ls
[elvis@station elvis]$ mkdir public_html
28

Filesystem basics
[elvis@station elvis]$ ls
public_html

Después Elvis puede crear un subdirectorio de public_html:

[elvis@station elvis] ls public_html


[elvis@station elvis] mkdir public_html/images
[elvis@station elvis] ls public_html
images

Sin embargo, observe que por defecto, mkdir no creará un subdirectorio si el directorio
padre no existe de antemano:

[elvis@station elvis] ls work


ls: work: No such file or directory
[elvis@station elvis] mkdir work/spreadsheets
mkdir: cannot create directory `work/spreadsheets': No such file or
directory

Sólo si Elvis utiliza mkdir -p (como 'padre') puede crear un árbol de directorios completo
de una sola vez:

[elvis@station elvis] ls work


ls: work: No such file or directory
[elvis@station elvis] mkdir -p work/spreadsheets
[elvis@station elvis] mkdir -p work/images/logos
[elvis@station elvis] mkdir -p work/images/advertising
[elvis@station elvis] ls work
images spreadsheets
[elvis@station elvis] ls work/images
advertising logos

Listado de árboles de directorios

Por ahora, tenga en cuenta que cuando se da un directorio como argumento al comando ls,
éste lista el contenido del directorio. ¿Pero qué pasa si el directorio contiene otros
directorios? Por defecto, el comando ls sólo mostrará el contenido del directorio del nivel
más alto. Si también quiere que el comando ls liste los subdirectorios, puede añadir la
opción -R.

Cuando un comando se repite a través de una estructura, operando en cada elemento de la


estructura de la misma manera que en el elemento superior, se dice que el comando actúa
de modo recursivo. La opción -R especifica que el comando ls debería listar con recursion.

Por ejemplo, hogan está explorando la configuración de red de la máquina y sospecha que
el directorio /etc/sysconfig/networking es un directorio importante. Para poder
descubrir los archivos y los subdirectorios que contiene, hogan lista el contenido del
directorio de modo recursivo.
29

Filesystem basics
[hogan@station hogan]$ ls -R /etc/sysconfig/networking/
/etc/sysconfig/networking/:
devices ifcfg-lo profiles

/etc/sysconfig/networking/devices:
ifcfg-eth0

/etc/sysconfig/networking/profiles:
default netup

/etc/sysconfig/networking/profiles/default:
hosts ifcfg-eth0 network resolv.conf

/etc/sysconfig/networking/profiles/netup:
hosts ifcfg-eth0 network resolv.conf

ls -R también se puede combinar con cualquiera de las opciones de línea de comando vistas
anteriormente, tales como ls -sR para incluir los tamaños de archivos, o ls -lR para incluir
los atributos de archivos.

Borrar directorios (vacíos): rmdir

El comando para borrar un directorio es rmdir. (remover directorio).

Uso:

rmdir [OPCIONES] {DIRECTORIO...}

Suprime el (los) DIRECTORIO(s) si están vacíos. Emite un mensaje de error si uno o más
del (los) DIRECTORIO(s) no está(n) vacío(s), pero los directorios que quedan (vacíos) se
borran. Tenga en cuenta que un directorio que contiene sólo un subdirectorio no se
considera como vacío.

Para borrar su subdirectorio ~/public_html/images Elvis puede proceder así:

[elvis@station elvis]$ ls
public_html
[elvis@station elvis]$ rmdir public_html/images
[elvis@station elvis]$ ls
[elvis@station elvis]$

Como lo señalamos antes, observe de nuevo que los comandos tales como mkdir y rmdir
funcionan de manera silenciosa. Como dice el dicho el silencio es oro.

Listado de árboles de directorios

Por ahora, tenga en cuenta que cuando se da un directorio como argumento al comando ls,
éste lista el contenido del directorio. ¿Pero qué pasa si el directorio contiene otros
30

Filesystem basics

directorios? Por defecto, el comando ls sólo mostrará el contenido del directorio del nivel
más alto. Si también quiere que el comando ls liste los subdirectorios, puede añadir la
opción -R.

Cuando un comando se repite a través de una estructura, operando en cada elemento de la


estructura de la misma manera que en el elemento superior, se dice que el comando actúa
de modo recursivo. La opción -R especifica que el comando ls debería listar con recursion.

Por ejemplo, a elvis le gustaría tener una lista de archivos y directorios más detallada en su
directorio ~/work. Recuerde que elvis antes tenía que emitir un comando ls por separado
para cada subdirectorio de ~/work con el fin de ver el contenido de subdirectorio. Ahora en
su lugar, puede utilizar la opción ls -R.

[elvis@station elvis]$ ls -R work


work/:
images spreadsheets

work/images:
advertising logos

work/images/advertising:

work/images/logos:

work/spreadsheets:

Observe que el comando anterior mostrará archivos así como directorios. En este ejemplo,
casualmente no hay ningún archivo para mostrar.

ls -R también se puede combinar con cualquiera de las opciones de línea de comando vistas
anteriormente, tales como ls -sR para incluir los tamaños de archivos, o ls -lR para incluir
los atributos de archivos.

Copiar árboles de directorios: cp -r

En el capítulo anterior cuando se introdujo cp, señalamos que con las opciones correctas el
comando cp serviría para copiar árboles de directorios completos. Aquí analizamos dicha
opción: -r (de recursive) (Muchos de los comandos tienen la opción de actuar de modo
recursivo es decir, recorriendo todas las ramas de un sub-árbol de directorio, actuando en
cada subdirectorio a su vez).

Considere la siguiente estructura en el directorio de inicio de Hogan:

Figure 1. Estructura del directorio antes de copiar

-- html
|
31

Filesystem basics
hogan -- website -- -- forms
|
| -- song1.midi
| |
| -- songs --
| | |
| | -- song2.midi
| |
-- media --
| -- picture1.png
| |
-- photos--
|
-- picture2.png

Aunque este árbol de directorios contiene muchas ramas y archivos, se puede copiar con
una sóla orden:

[hogan@station hogan]$ cp -r website archive

Figure 2. Estructura del directorio después de copiar

-- html
|
-- website -- -- forms
| |
| | -- song1.midi
| | |
| | -- songs --
| | | |
| | | -- song2.midi
| | |
| -- media --
| | -- picture1.png
| | |
hogan -- -- photos--
| |
| -- picture2.png
|
| -- html
| |
-- archive -- -- forms
|
| -- song1.midi
| |
| -- songs --
| | |
| | -- song2.midi
| |
-- media --
| -- picture1.png
| |
-- photos--
32

Filesystem basics
|
-- picture2.png

Recuerde la diferencia en el comportamiento de cp cuando el último argumento es un


directorio existente: se hace una copia del (los) archivo(s) fuente(s) dentro del directorio
destino. En la demostración anterior el directorio archive no existía previamente así que
fue creado. Pero si el directorio archive ya hubiese existido el efecto hubiera sido
diferente.

Figure 3. Estructura del directorio antes de copiar

-- html
|
-- website -- -- forms
| |
| | -- song1.midi
| | |
| | -- songs --
| | | |
| | | -- song2.midi
hogan -- | |
| -- media --
| | -- picture1.png
| | |
| -- photos--
| |
| -- picture2.png
-- archive

Hogan usa exactamente el mismo comando que antes para copiar:

[hogan@station hogan]$ cp -r website archive

Figure 4. Estructura del directorio después de copiar con cp -r websitearchive

-- html
|
-- website -- -- forms
| |
| | -- song1.midi
| | |
| | -- songs --
| | | |
| | | -- song2.midi
| | |
| -- media --
| | -- picture1.png
| | |
hogan -- -- photos--
| |
| -- picture2.png
33

Filesystem basics
|
| -- html
| |
-- archive -- website -- -- forms
|
| -- song1.midi
| |
| -- songs --
| | |
| | -- song2.midi
| |
-- media --
| -- picture1.png
| |
-- photos--
|
-- picture2.png

En esta segunda demonstración, el directorio website es recreado dentro del directorio


archive.

Borrar árboles de directorios: rm -r

En el capítulo anterior cuando se introdujo rm, señalamos que con las opciones correctas,
el comando rm puede borrar por completo árboles de directorios. De nuevo, para cp la
opción es -r (derecursivo).

Considere la siguiente estructura en el directorio de inicio de Hogan:

Figure 1. Estructura del directorio antes de borrarlo

-- html
|
hogan -- website -- -- forms
|
| -- song1.midi
| |
| -- songs --
| | |
| | -- song2.midi
| |
-- media --
| -- picture1.png
| |
-- photos--
|
-- picture2.png

Si Hogan quisiera borrar el sub-árbol media, podría utilizar un sólo comando:

[hogan@station hogan]$ rm -r website/media


34

Filesystem basics

Figure 2. Estructura del directorio después de borrar

-- html
|
hogan -- website --
|
-- forms

Vale la pena anotar una vez más que, en general, el borrar archivos no tiene reversa. Si se
utiliza de manera negligente el comando rm -r es muy peligroso.

Ejemplos

Hacer una copia de seguridad de un árbol de directorios

El usuario hogan ha estado trabajando bastante en un reporte, el cual tiene varios archivos
que ha organizado en subdirectorios bajo un directorio llamado report.

report/
|-- chapter01/
| |-- figures/
| | |-- image01.png
| | `-- image02.png
| |-- section01.html
| `-- section02.html
`-- chapter02/
|-- figures/
| |-- image01.png
| `-- image02.png
|-- section01.html
`-- section02.html

4 directories, 8 files

Está a punto de utilizar un corrector ortográfico para chequear y remplazar las palabras mal
escritas. Ya que esta es la primera vez que utiliza este corrector ortográfico, quiere hacer
una copia de seguridad de su trabajo antes de continuar. Primero trata de hacer una copia de
seguridad con el comando cp.

[hogan@station hogan]$ cp report report.bak


cp: omitting directory `report'

Al darse cuenta de su error añade la opción -r para decirle al comando cp que copie de
modo recursivo.

[hogan@station hogan]$ cp -r report report.bak

Ahora el contenido del directorio report es copiado de modo recursivo al directorio


report.bak.
35

Filesystem basics
.
|-- report/
| |-- chapter01/
| | |-- figures/
| | | |-- image01.png
| | | `-- image02.png
| | |-- section01.html
| | `-- section02.html
| `-- chapter02/
| |-- figures/
| | |-- image01.png
| | `-- image02.png
| |-- section01.html
| `-- section02.html
`-- report.bak/
|-- chapter01/
| |-- figures/
| | |-- image01.png
| | `-- image02.png
| |-- section01.html
| `-- section02.html
`-- chapter02/
|-- figures/
| |-- image01.png
| `-- image02.png
|-- section01.html
`-- section02.html

10 directories, 16 files

Una vez que hogan haya usado el corrector ortográfico y que esté contento con los
resultados, quiere suprimir el directorio de copia de seguridad report.bak. Primero utiliza
el comando rmdir.

[hogan@station hogan]$ rmdir report.bak/


rmdir: `report.bak/': Directory not empty

Recuerde que rmdir sólo funciona en directorios vacíos así que en su lugar utiliza rm -r.

[hogan@station hogan]$ rm -r report.bak/


[hogan@station hogan]$ ls
report

Creación de una copia local de los archivos de ejemplo

El usuario ventura está interesado en programar con el lenguage python. Descubrió scripts
de muestra en el directorio /usr/share/doc/pygtk2-1.99.14/examples/. Le gustaría
jugar con los scripts para poder probar nuevas ideas, pero no tiene permiso de escritura en
los archivos. Decide hacer una copia local de los scripts.
36

Filesystem basics
[ventura@station ventura]$ cp -r /usr/share/doc/pygtk2-1.99.16/examples/

.
[ventura@station ventura]$ ls -R examples/

examples/:
atk gl glade gobject ide neil pango pygtk-demo simple

examples/atk:
atk-demo.py

examples/gl:
cone.py dots.py gears.py README

examples/glade:
glade-demo.py README test.glade

examples/gobject:
properties.py signal.py

examples/ide:
break.xpm edit.py gtkdb.py next.xpm README step.xpm
browse.py edit.xpm gtkprof.py pyide.py return.xpm
...
Observe el uso del nombre de directorio . para referirse a "el directorio local".
Cuando cp recibe un directorio como destino (el último argumento) copia a ese
directorio, preservando los nombres de los archivos originales. En este caso, el
directorio examples fue copiado al directorio ..
El comando ls -R genera una lista recursiva de todo archivo en el directorio recién
creado example.

Ahora ventura tiene una copia a nivel local de los scripts python, lo que significa que los
puede modificar cuando quiera.

Ejercicios en línea

Administración de directorios

Lab Exercise
Objetivo: Listar, copiar, mover y suprimir directorios de manera eficiente.

Tiempo estimado: 20 minutos.

Especificaciones

Se le ha despertado el interés en gdm, una aplicación que proporciona la pantalla de inicio


de sesión gráfica de su sistema y desea explorar su diseño.
37

Filesystem basics

1. Utilice el comando ls (con las opciones apropiadas) para obtener un listado


recursivo, incluyendo tamaños (-s) del contenido del directorio /usr/share/gdm.
Redireccione la salida del comando a un archivo en su directorio de inicio llamado
lsgdm.txt (debido a propósitos evaluativos es importante que especifique el
directorio como una referencia absoluta, por ejemplo, no share/gdm).
2. Haga un copia (recursiva) del directorio /usr/share/gdm en su directorio de inicio.
El directorio copiado también se debe llamar gdm.
3. Haga una segunda copia del directorio recién creado en su directorio de inicio. gdm,
llamado gdm.bak.
4. Desde su copia de seguridad, suprima (de modo recursivo) el subdirectorio
gdm.bak/themes/circles.
5. De nuevo desde su copia de seguridad, mueva el subdirectorio
gdm.bak/themes/Bluecurve a su directorio de inicio (el directorio todavía se debe
llamar Bluecurve).

Deliverables

Question 1

1. Un archivo en su directorio de inicio llamado lsgdm.txt, el cual contiene la salida


redireccionada de un listado recursivo, inclyendo el tamaño del directorio
/usr/share/gdm.
2. Un directorio en su directorio de inicio llamado gdm, el cual es una copia exacta del
directorio /usr/share/gdm.
3. Un directorio en su directorio de inicio llamado gdm.bak, el cual es una copia
exacta del directorio gdm, con el subdirectorio gdm.bak/themes/circles borrado y
con el subdirectorio gdm.bak/themes/Bluecurve/ movido a su directorio de
inicio.
4. Un directorio en su directorio de inicio llamado Bluecurve, el cual es el resultado
del resultado anterior.

Limpieza

Los directorios creados son bastante grandes, así que si quiere conservar espacio de disco
puede borrarlos cuando haya terminado.

Capítulo 5 Nombres y comodines de archivos

Conceptos clave
38

Filesystem basics

• Los nombres de archivos pueden contener casi cualquier caracter a excepción de /.


• Aunque los nombres de archivos pueden contener casi cualquier caracter eso no
significa que deban contenerlos.
• Los archivos que comienzan con . son archivos "ocultos".
• Los caracteres *, ?, [...], y [^...] se pueden utilizar para encontrar los archivos con
nombres de archivos similares por medio de un proceso llamado "comodines de
archivo".

Nombres de archivo

Muchos sistemas operativos restringen el número y tipo de caracteres que se pueden utilizar
al nombrar archivos. En Linux, virtualmente cualquier caracter imprimible se puede utilizar
en el nombre de archivo y los nombres pueden ser casi de cualquier longitud.

Los nombres de archivos de Linux pueden tener hasta 255 caracteres, excluyendo cualquier
componente de directorio. Cuando se utiliza en un comando, un nombre de archivo
absoluto o relativo, incluyendo los componentes del directorio, pueden tener hasta de ¡4095
caracteres! Esto permite que los nombres de archivo y directorios puedan ser bastante
descriptivos.

Los nombres de archivos de Linux pueden contener cualquier caracter imprimible (y


algunos que no lo son) a excepción de la barra oblicua /. Esta barra no puede ser parte del
nombre de archivo, puesto que es el caracter utilizado para separar los componentes del
nombre de un directorio en un nombre relativo o completamente calificado. Como la
mayoría de los caracteres "inusuales" son meta-caracteres de shell, deben estar protegidos
entre comillas para poderlos utilizar en un nombre de archivo:

[julius@station julius]$ touch 'a and b'


[julius@station julius]$ touch '"'
[julius@station julius]$ touch "'"
[julius@station julius]$ touch '!@#$%^&*()_+=-|\}]{[:;?>.<,~`'
[julius@station julius]$ ls
!@#$%^&*()_+=-|\}]{[:;?>.<,~` ' " a and b
[julius@station julius]$

Como lo puede ver, se crearon cuatro archivos con nombres un poco extraños.

Warning
El ejemplo anterior es sólo a manera de ilustración. Muchos de los caracteres
utilizados en este ejemplo son meta-caracteres shell, cuyo significado aún no se ha
discutido aquí. Debe evitar utilizar signos de puntuación en los nombres de archivos,
pues si los utiliza de manera inapropiada puede producir resultados desastrosos.
39

Filesystem basics

La advertencia anterior no se debe olvidar. En general, los nombres de archivos deben estar
compuestos de caracteres alfabéticos y numéricos (A-Z, a-z, 0-9) y signos de puntuación ._-
+~ (punto, guión bajo, guión, más, tilde). Normalmente, los nombres de archivos deben
iniciar con un caracter alfanumérico o con un punto (vea la siguiente sección sobre archivos
ocultos). Aunque encontrará nombres de archivos con espacios incrustados no se
recomienda utilizarlos.

Figure 1. Caracteres "seguros" para nombres de archivos

A-Z a-z 0-9 . _ - + ~

Aquí hay dos ejemplos que le mostrarán el daño que puede causar el uso de caracteres no-
significativos. Vamos a abusar de dos meta-caracteres de shell: el espacio y el signo mayor
que.

Ejemplo 1: ¡Tenga cuidado con esos espacios!

[hogan@station hogan]$ mkdir bad dir

[hogan@station hogan]$ touch this and that

[hogan@station hogan]$ mv this and that bad dir

[hogan@station hogan]$ ls
dir
Hogan intenta crear un directorio llamado 'bad dir,' pero sin saber creó dos
directorios, uno llamado 'bad' y otro llamado 'dir'.
Después, Hogan trata de crear un archivo llamado 'this and that' con touch, pero
en realidad crea tres archivos llamados 'this', 'and', y'that'.
Ahora Hogan intenta mover el archivo que él cree que se llama 'this and that' al
directorio que el piensa que se llama 'bad dir', pero lo que hace es mover todos los
cuatro 'directoriosthis', 'and', 'that', y 'bad' (tres archivos comunes y un directorio)
al directorio dir.
Puesto que todos los comandos anteriores se ejecutaron "con éxito", sólo hasta este
momento Hogan se da cuenta de que algo ha salido mal.

Es obvio que, si Hogan hubiese encerrado entre comillas los nombres como se mostró en
las notas explicativas, las cosas hubiesen funcionado como él lo quería. Hecho que vale la
pena recordar, ya que encontrará nombres de archivos con espacios encrustados. En
relación a esto, un nombre de archivo que contiene espacios al principio y al final es legal,
pero es muy difícil de identificar en un listado de archivos.

Ejemplo 2: Una pequeña equivocación de dirección


40

Filesystem basics

[hogan@station hogan]$ mkdir bad- > dir

[hogan@station hogan]$ touch this

[hogan@station hogan]$ mv this bad- > dir

[hogan@station hogan]$ ls
bad- dir
Hogan finalmente decide evitar los espacios. Esta vez intenta crear un directorio
llamado 'bad-> dir' pero sin querer crea un directorio llamado 'bad-' y un archivo
llamado 'dir' (¿por qué?).
Después Hogan crea un archivo llamado 'this' con touch. ¡Este paso lo hace bien!

Ahora Hogan trata de mover un archivo llamado 'this' al directorio que el piensa que
se llama 'bad->dir,' pero en vez de lograr esto, mueve 'this' al directorio bad-,
redireccionando la salida (no hay ninguna) al archivo 'dir'.
De nuevo, sólo hasta ahora Hogan se da cuenta de que algo ha salido mal.

Como antes, si Hogan hubiese utilizado las comillas para encerrar los nombres de archivos,
las cosas habrían salido como él quería. Las comillas enmascaran una multitud de pecados,
pero no utilice esto como excusa para crear nombres de archivos inapropiados. Muchas de
las tareas que aún tenemos que aprender se hacen más fáciles si se utilizan nombres
"normales" para los archivos.

Archivos ocultos

Los nombres de archivos y directorios (recuerde un directorio es un tipo de archivo) que


comienzan por un punto son archivos "ocultos". Estos archivos no aparecen en los listados
de directorio producidos por ls a menos que se utilice la opción de comando especial -a (del
inglés all) o a menos que se especifique el punto inicial como parte del nombre. Se hace
posible reducir la aglomeración de elementos y la confusión manteniendo ciertos archivos"
fuera de vista y de consideración".

En la próxima sección aprenderemos a nombrar múltiples archivos por medio de una


técnica conocida como uso de "comodines". En general, los archivos ocultos tampoco
aparecen en un "comodín" a no ser que el punto inicial sea listado específicamente.

Aparte de ocultar el archivo, el punto inicial no tiene otra importancia y los archivos y
directorios ocultos se pueden utilizar como cualquiera de los otros.

[alice@station alice]$ mkdir .secret


[alice@station alice]$ touch sample
[alice@station alice]$ ls
41

Filesystem basics
sample
[alice@station alice]$ ls -a
. .. sample .secret
[alice@station alice]$ mv sample .secret
[alice@station alice]$ ls
[alice@station alice]$ ls .secret
sample
[alice@station alice]$ cd .secret
[alice@station .secret]$ ls
sample
[alice@station .secret]$

"Comodines"

Con frecuencia es necesario emitir un comando que actúe en más de un archivo. Los
comandos como cp -r y rm -r funcionan en sub-árboles enteros de directorios, sin
embargo, Linux cuenta con una manera más flexible de identificar grupos de archivos. La
shell de comando bash trata algunos de sus meta-caracteres especiales como comodines.
Cuando bash lee la línea de comando, la shell realiza un proceso llamado expansión de
meta-caracteres o expansión de comodines, lo cual genera una lista de nombres de archivos
que coinciden con el patrón descrito por la expresión del comodín y luego pasa la lista
generada al comando. Esto se conoce comúnmente como "comodines de nombres de
archivos."

Table 1. Comodines

Caracter Efecto
* coincide con cero o más caracteres (a excepción del punto inicial)
? coincide exactamente con un caracter (a excepción del punto inicial)
[...] coincide exactamente con un caracter de la lista o rango
[^...] coincide exactamente con un caracter no incluido en la lista o rango

El uso de * y ? es más bien sencillo. Los comodines de listas son un poco más complicados,
pero también bastante poderosos y útiles.

El comodín de parentesis representa una lista de caracteres individuales. Por lo tanto,


[aeiou] coincide con cualquier vocal. Un rango contiguo de caracteres se puede
representar utilizando un guión como en [a-z] para el alfabeto en minúsculas. Una ^
inicial, niega la lista de manera que [^aeiou] sea cualquier caracter menos una vocal. Un
guión "real" se puede representar escapando los caracteres utilizando una barra invertida (\)
(más adelante se abordará este tema). Por lo tanto, la expresión [a\-z] coincide con a, z o
un guión sólamente. Se pueden mezclar caracteres individuales y rangos. El patrón [A-Za-
z0-9._\-+~] coincide con cualquiera de los caracteres "seguros" de nombres de archivos
mencionados anteriormente en la gráfica 5-1.
42

Filesystem basics

Suponga que el directorio actual contiene los siguientes archivos:

image1.jpg image10.jpeg page1.html page3.htm script1.pl


image2.jpg image11.jpeg page2.html page40.htm

La siguiente tabla ilustra el uso de estos comodines.

Table 2. Ejemplos de comodines

Patrón Genera la lista


* todos los archivos en la lista
*.html page1.html page2.html
page*.htm* page1.html page2.html page3.htm page40.htm
image?.* image1.jpeg image2.jpeg
[ps]* page1.html page2.html page3.htm page40.htm script1.pl
[^ps]* image1.jpeg image2.jpeg image10.jpeg image11.jpeg

Los comodines se pueden utilizar con cualquier comando que espera el nombre de un
archivo. Por ejemplo, el comando

[bob@station bob] mv *.htm public_html

es lo mismo que el comando

[bob@station bob] mv page3.htm page40.htm public_html

asumiendo que el directorio de inicio de Bob contiene los archivos listados anteriormente.

[Nota técnica: muchos de los comandos se comportan de manera diferente cuando no


aparecen archivos en la lista, contrario a cuando uno o más archivos se dan como parte del
comando. Entonces, ¿qué sucede en dicho comando si se utiliza un patron de comodín de
modo que el listado de archivos esté vacío? En el caso especial donde la shell bash intenta
expandir una expresión de comodín y no coincide con nada, ésta deja la expresión como
parte del comando. Esto se ilustra a continuación:

[bob@station bob]$ rm
rm: too few arguments
Try `rm --help' for more information.
[bob@station bob]$ rm z*
rm: cannot lstat `z*': No such file or directory

En el primer rm, el comando vio cero nombres de archivos y falló presentando un mensaje
de error. En la segunda versión, la shell no pudo generar una lista de nombres del patrón z*
y por lo tanto la cadena z*se envió a rm como el nombre de archivo mismo. Como Bob no
tiene un archivo llamado z* en su directorio, el comando falló con un mensaje diferente].
43

Filesystem basics

Ejemplos

Búsqueda de ese archivo de configuración

Alice estaba revisando recientemente el archivo de configuración del DNS (Servicio de


Nombres de Dominio), pero olvidó el nombre. Recuerda que el archivo terminaba en
.conf. Con el fin de reducir el número de archivos a tomar en consideración, utilizó los
comodines para listar todos los archivos en el directorio /etc terminados en .conf.

[alice@station images]$ ls /etc/*.conf


/etc/aep.conf /etc/lftp.conf /etc/pnm2ppa.conf
/etc/aeplog.conf /etc/libuser.conf /etc/pwdb.conf
/etc/cdrecord.conf /etc/logrotate.conf /etc/resolv.conf
/etc/esd.conf /etc/lpd.conf /etc/rndc.conf
/etc/fam.conf /etc/ltrace.conf /etc/scrollkeeper.conf
/etc/gpm-root.conf /etc/modprobe.conf /etc/sysctl.conf
/etc/grub.conf /etc/mtools.conf /etc/syslog.conf
/etc/host.conf /etc/named.conf /etc/updatedb.conf
/etc/initlog.conf /etc/nscd.conf /etc/updfstab.conf
/etc/jwhois.conf /etc/nsswitch.conf /etc/warnquota.conf
/etc/krb5.conf /etc/ntp.conf /etc/webalizer.conf
/etc/krb.conf /etc/pam_smb.conf /etc/wvdial.conf
/etc/ldap.conf /etc/pbm2ppa.conf /etc/xinetd.conf
/etc/ld.so.conf /etc/pine.conf /etc/yp.conf

Mirando un poco más reconoce el archivo de configuración resolv.conf.

Listado de bibliotecas estáticas

Bob ha estado aprendiendo la diferencia entre bibliotecas enlazadas estáticamente y


dinámicamente que los programas utilizan. El sabe que las bibliotecas enlazadas estática y
convencionalmente tienen el nombre de libalgo.a, en donde algo es el nombre de la
biblioteca. También sabe que las bibliotecas se encuentran por lo general en el directorio
/usr/lib.

Cuando echa un vistazo a las bibliotecas estáticas instaladas en su sistema, encuentra cerca
de 1000 archivos en el directorio /usr/lib. Para reducir el número de archivos a examinar
trata de listar todos los archivos terminados en a.

[bob@station bob]$ ls /usr/lib/*a


/usr/lib/liba2ps.a /usr/lib/libimlib-ps.a
/usr/lib/libacl.a /usr/lib/libimlib-tiff.a
/usr/lib/libanl.a /usr/lib/libimlib-xpm.a

...

/usr/lib/mozilla:
plugins
44

Filesystem basics
/usr/lib/samba:
vfs

Muchas de las líneas de este listado largo han sido borradas, pero se han dejado las
suficientes para ilustrar el problema, el "comodín" de bob no fue lo suficientemente
específico y capturó también algunos de los directorios terminados en a. Refinando un poco
más la lista obtiene lo que quiere.

[bob@station bob]$ ls /usr/lib/lib*.a


/usr/lib/liba2ps.a /usr/lib/libimlib-ps.a
/usr/lib/libacl.a /usr/lib/libimlib-tiff.a
/usr/lib/libanl.a /usr/lib/libimlib-xpm.a

...

/usr/lib/libimlib-jpeg.a /usr/lib/libz.a
/usr/lib/libimlib-png.a /usr/lib/libzvt.a
/usr/lib/libimlib-ppm.a

Luego, bob sospecha que las bibliotecas utilizadas con más frecuencia tienen nombres
cortos y eficientes (tal vez descriptivos). Procede a listar todas las bibliotecas que tengan
nombres de una, dos o tres letras.

[bob@station bob]$ ls /usr/lib/lib?.a


/usr/lib/libc.a /usr/lib/libl.a /usr/lib/libz.a
/usr/lib/libg.a /usr/lib/libm.a
[bob@station bob]$ ls /usr/lib/lib??.a
/usr/lib/libdl.a /usr/lib/libgd.a /usr/lib/librt.a
/usr/lib/libfl.a /usr/lib/libmp.a
[bob@station bob]$ ls /usr/lib/lib???.a
/usr/lib/libacl.a /usr/lib/libgdk.a /usr/lib/libosp.a
/usr/lib/librle.a
/usr/lib/libanl.a /usr/lib/libgif.a /usr/lib/libpam.a
/usr/lib/librpm.a
/usr/lib/libapm.a /usr/lib/libgmp.a /usr/lib/libpbm.a
/usr/lib/libSDL.a
/usr/lib/libbfd.a /usr/lib/libgpm.a /usr/lib/libpci.a
/usr/lib/libssl.a
/usr/lib/libbsd.a /usr/lib/libgtk.a /usr/lib/libpgm.a
/usr/lib/libttf.a
/usr/lib/libefs.a /usr/lib/libIDL.a /usr/lib/libpng.a
/usr/lib/libusb.a
/usr/lib/libesd.a /usr/lib/libnsl.a /usr/lib/libpnm.a
/usr/lib/libxml.a
/usr/lib/libgal.a /usr/lib/libogg.a /usr/lib/libppm.a
/usr/lib/libzvt.a

¿Hay alguna forma fácil de utilizar los comodines para que bob pudiese haber listado las
bibliotecas con uno, dos o tres caracteres de nombres con una sola expresión?

Listado de las páginas man


45

Filesystem basics

La usuaria alice descubrió que los archivos que contienen las páginas man se encuentran
instalados en el directorio /usr/share/man en los subdirectorios relacionanados con los
capítulos de las páginas man.

[alice@station man]$ ls /usr/share/man/


cs de_DE fr hu it man1 man3 man5 man7 man9 pl ru sv
de es fr_FR id ja man2 man4 man6 man8 mann pt_BR sk

Como usuaria regular del sistema, sabe que los capítulos que más le interesan son el 1, 5 y
7. Utiliza una expresión con comodines para enumerar sólo el contenido de esos
directorios.

[alice@station man]$ ls /usr/share/man/man[157]


/usr/share/man/man1:
:.1.gz pbmtolj.1.gz
[.1.gz pbmtoln03.1.gz
411toppm.1.gz pbmtolps.1.gz
a2p.1.gz pbmtomacp.1.gz

...

groff.7.gz wireless.7.gz
groff_char.7.gz x25.7.gz
groff_diff.7.gz

Si alice hubiese estado interesada en todas las páginas man de los capítulos numerados,
pero no en los capítulos impares "n" podría haber utilizado la expresión de rango con
comodines.

[alice@station man]$ ls /usr/share/man/man[1-9]


/usr/share/man/man1:
:.1.gz pbmtolj.1.gz
[.1.gz pbmtoln03.1.gz
411toppm.1.gz pbmtolps.1.gz
a2p.1.gz pbmtomacp.1.gz

...

named-checkconf.8.gz zic.8.gz
named-checkzone.8.gz

/usr/share/man/man9:

Ejercicios en línea

Administración de archivos con comodines

Lab Exercise
Objetivo: Administrar archivos de modo eficiente por medio del uso de comodines
46

Filesystem basics

de archivo.

Tiempo estimado: 20 minutos.

Especificaciones

Este laboratorio utilizará comodines de archivo para administrar un gran número de


archivos que tienen nombres vagamente estructurados. Todos los archivos se encuentran en
el directorio /usr/share/tcl8.4/encoding.

1. Cree los siguientes directorios en su directorio de inicio: cp_even, cp_mid,


cp_thousand, iso_mid, mac y xxxn.
2. Examine los archivos en el directorio /usr/share/tcl8.3/encoding. Copie todos
los archivos que comienzan con mac en el directorio mac.
3. Copie todos los archivos que comienzan con cp y que tengan un número par en el
directorio cp_even.
4. Copie todos los archivos que comienzan con cp y que tengan un número mayor a
1000 en el directorio cp_thousand.
5. Copie todos los archivos que comienzan con cp y que tengan un número mayor a
800, pero menor que 1000 en el directorio cp_mid.
6. Copie todos los archivos que comienzan con iso8859- y que tengan un número
después del guión entre 3 y 8 (inclusive) en el directorio iso_mid.
7. Copie todos los archivos cuyos primeros cuatro caracteres estén compuestos de
exactamente tres letras seguidas por un número dentro del directorio xxxn.

Deliverables

Question 1

Si ha realizado el ejercicio correctamente, debe tener los seis directorios con los siguientes
archivos.

[bob@station bob]$ ls *
cp_even:
cp1250.enc cp1256.enc cp852.enc cp864.enc cp932.enc
cp1252.enc cp1258.enc cp860.enc cp866.enc cp936.enc
cp1254.enc cp850.enc cp862.enc cp874.enc cp950.enc

cp_mid:
cp850.enc cp857.enc cp862.enc cp865.enc cp874.enc cp949.enc
cp852.enc cp860.enc cp863.enc cp866.enc cp932.enc cp950.enc
cp855.enc cp861.enc cp864.enc cp869.enc cp936.enc

cp_thousand:
cp1250.enc cp1252.enc cp1254.enc cp1256.enc cp1258.enc
47

Filesystem basics

cp1251.enc cp1253.enc cp1255.enc cp1257.enc

iso_mid:
iso8859-3.enc iso8859-5.enc iso8859-7.enc
iso8859-4.enc iso8859-6.enc iso8859-8.enc

mac:
macCentEuro.enc macDingbats.enc macJapan.enc macThai.enc
macCroatian.enc macGreek.enc macRoman.enc macTurkish.enc
macCyrillic.enc macIceland.enc macRomania.enc macUkraine.enc

xxxn:
big5.enc iso8859-13.enc iso8859-2.enc iso8859-7.enc jis0212.enc
iso2022.enc iso8859-14.enc iso8859-3.enc iso8859-8.enc koi8-r.enc
iso2022-jp.enc iso8859-15.enc iso8859-4.enc iso8859-9.enc koi8-u.enc
iso2022-kr.enc iso8859-16.enc iso8859-5.enc jis0201.enc ksc5601.enc
iso8859-10.enc iso8859-1.enc iso8859-6.enc jis0208.enc

Sugerencias

El siguiente comando copiaría los archivos que coinciden con el primer criterio (asumiendo
que el directorio de trabajo actual es el directorio de inicio de Bob).

[bob@station bob]$ cp /usr/share/tcl8.3/encoding/mac* mac/

Capítulo 6 Examen de archivos

Conceptos clave

• El comando file muestra el tipo de archivo


• El comando cat muestra el contenido de un archivo
• Los comandos more y less "hojean" através de un archivo, una pantalla completa a
la vez.
• Los comandos head y tail presentan las primeras o las últimas líneas de un archivo.
• En el entorno gráfico X se puede utilizar nautilus para examinar archivos de texto.

Ver archivos

Linux ofrece varios comandos para examinar archivos y su contenido. Esta lección aborda
algunas de las herramientas más utilizadas.

El comando file
48

Filesystem basics

El contenido de cualquier archivo dado puede ser ASCII (texto plano, HTML, scripts de
shell, código fuente del programa, etc.) o binario (un ejecutable compilado, un archivo,
comprimido, audio, etc.).

Los comandos analizados en este capítulo son sólo para uso en archivos ASCII, el intentar
usarlos con archivos binarios puede generar problemas un poco molestos (como pantallas
llenas de caracteres extraños) o hasta problemas mayores (bloqueando la terminal). Esto se
debe a que los archivos binarios pueden contener códigos binarios arbitrarios y algunos de
estos códigos tienen un significado especial cuando se (mal )interpretan como texto ASCII.
Por lo tanto, es una buena idea revisar el tipo de archivo de cualquier archivo que usted no
reconozca utilizando file antes de intentar ver el archivo con otra de las herramientas que se
muestran aquí.

file [OPCIONES] [ARCHIVO...]

Prueba FILE(s) para determinar el tipo de archivo y muestra los resultados en la salida
estándar.

Ejemplo de uso con archivos ASCII:

[nero@station nero]$ file index.html novel.ps mailer


index.html: HTML document text
novel.ps: PostScript document text conforming at level 3.0
mailer: perl script text executable

Ejemplo de uso con archivos binarios:

[nero@station nero]$ file logo.jpeg symphony.mp3 archive.tgz


logo.png: PNG image data, 387 x 69, 8-bit grayscale, non-
interlaced
symphony.mp3: MP3, 128 bits, 44.1 kHz, JStereo
archive.tgz: gzip compressed data, deflated, last modified: Thu
Mar 20 21:27:27 2003, os: Unix

El comando cat

Este comando se introdujo por primera vez en el capítulo 3 de este cuaderno. Aquí le
mostramos algunas de sus opciones.

cat [OPCIONES] [ARCHIVO...]

Concatena FILE(s) en la salida estándar.

Opción Efecto
49

Filesystem basics

Opción Efecto
Muestra todos los caracteres incluyendo los caracteres de control y los de no
-A
impresión.
-s " Apiña" múltiples líneas adyacentes en blanco en una sóla línea en blanco
-n Numera las líneas de la salida

El comando cat, cuando se utiliza para ver archivos, simplemente muestra todo el
contenido de una sola vez. Los archivos largos pasan por la pantalla de manera muy rápida
haciendo que cat sea el comando más apropiado para aquellos archivos con menos de una
pantalla de texto.

Los paginadores more y less

Tanto more como less están diseñados para ver archivos de texto en la pantalla. Su uso es
muy similar aunque el comando less es un poco más moderno y tiene unas pocas
características extras tales como el responder de manera correcta a [PgArriba], [PgAbajo] y
a las flechas de navegación. Después de todo,less es more.

Es bien importante familiarizarse con el comando less, ya que otras herramientas (como
man) lo utilizan en segundo plano para brindar funciones de paginador.

more [OPCIONES] [ARCHIVO...]

Muestra el/los archivo(s)FILE(s) en la salida estándar y una pantalla a la vez bajo el control
del teclado.

Opción Acción
-c Limpia la pantalla y redibuja en vez de desplazarse
-s "Apiña" múltiples líneas adyacentes en blanco en una sóla línea en blanco

less [OPCIONES] [ARCHIVO...]

Muestra el/los archivo(s)FILE(s) en la salida estándar y una pantalla a la vez bajo el control
del teclado.

Opción Acción
-c Limpia la pantalla y redibuja en vez de desplazarse
-r Muestra los caracteres de control básico
50

Filesystem basics

Opción Acción
-s "Apiña" múltiples líneas adyacentes en blanco en una sóla línea en blanco

Table 1. Comandos de navegación less (more)

Comando more? Acción


>espacio> Si adelanta una pantalla entera
[PgDn] No adelanta una pantalla entera
b Si devuelve una pantalla entera
[PgUp] No devuelve una pantalla entera
[DnArrow] No adelanta una línea
[Flechaarriba] No se devuelve una línea
/text Si va hacia adelante para buscar texto
?texto No va hacia atrás para buscar texto
n Si repite la última búsqueda
N No repite la última búsqueda pero en dirección contraria
q Si quit
h Si ayuda (introduce muchos comandos nuevos)

Una de las características del paginador less es que depende de un concepto estándar de
Unix llamado tuberías. Aunque las tuberías se discuten más adelante esta característica de
less es bastante útil y sencilla de utilizar así que amerita presentarla ahora. Una tubería
actúa como un redireccionamiento en donde la salida de un comando es redireccionado a un
lugar distinto de la terminal. Con la redirección (usando >) la salida se redirecciona a un
archivo específico. Cuando se utiliza una tubería la salida de un comando es redireccionada
como entrada de otro comando. La shell bash usa el caracter | (suele encontrarse encima de
la tecla RETURN) para construir tuberías.

Al ejecutar un comando que produce bastante salida, ésta se puede poner en una tubería
usandoless. En vez de ser botada a una terminal, la salida se puede navegar como si fuese
un archivo, subiendo y bajando de página y haciendo búsquedas. Cuando termine salga de
less y la salida desaparecerá.

El usuario elvis está utilizando el comando ps aux para ver una tabla con todos los
procesos que están ejecutándose en la máquina. Como espera que la salida sea más bien
larga, decide entonces poner una tubería del comando al navegador less.

[elvis@station elvis]$ ps aux


USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 1392 92 ? S 17:27 0:04 init [
51

Filesystem basics
root 2 0.0 0.0 0 0 ? SW 17:27 0:00 [keventd]
root 3 0.0 0.0 0 0 ? SW 17:27 0:00 [kapmd]
root 4 0.0 0.0 0 0 ? SWN 17:27 0:00
[ksoftirqd_CPU0]
root 9 0.0 0.0 0 0 ? SW 17:27 0:00 [bdflush]
...
[elvis@station elvis]$ ps aux | less

Ahora él puede utilizar la mismas secuencia que utiliza al navegar un archivo (o las páginas
man) para hojear las salidas de los comandos ps:ESPACIO para avanzar, b para
retroceder, /textRETORNO para buscar el texto text, y q para salir.

El comando head

Algunas veces todo lo que se necesita al examinar un archivo es ver las primeras líneas del
archivo. El comando head nos permite hacer esto.

head [OPCIONES] [ARCHIVO...]

Escribe las primeras 10 líneas de cada ARCHIVO a la salida estándar.

Opción Efecto
-num, -n num Imprime las primeras num líneas (por defecto es 10).
-q Suprime encabezados que dan nombres de archivo

En el siguiente ejemplo elvis examinará las primeras 10 líneas y luego las primeras 5 líneas
del archivo /etc/group.

[elvis@station elvis]$ head /etc/group


root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
sys:x:3:root,bin,adm
adm:x:4:root,adm,daemon
tty:x:5:
disk:x:6:root
lp:x:7:daemon,lp
mem:x:8:
kmem:x:9:
[elvis@station elvis]$ head -n 5 /etc/group
root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
sys:x:3:root,bin,adm
adm:x:4:root,adm,daemon
52

Filesystem basics

Si se le da más de un nombre de archivo como argumento head presentará unas primeras


pocas líneas de cada archivo individualmente separado por un encabezado que muestra el
nombre de archivo. En el siguiente ejemplo, elvis lista las primeras pocas líneas de los
scripts de servicios de Red Hat que se encuentran en el directorio /etc/rc.d/init.d.

[elvis@station elvis]$ head -5 /etc/rc.d/init.d/*


==> /etc/rc.d/init.d/aep1000 <==
#!/bin/sh
#
# Tags
# chkconfig: - 30 70
# description: load and unload AEP1000/AEP2000 coprocessor driver

==> /etc/rc.d/init.d/anacron <==


#!/bin/sh
# Startup script for anacron
#
# chkconfig: 2345 95 05
# description: Run cron jobs that were left out due to downtime

==> /etc/rc.d/init.d/apmd <==


#!/bin/sh
#
# chkconfig: 2345 26 74
# description: apmd is used for monitoring battery status and logging it
via \
# syslog(8). It can also be used for shutting down the machine when
\

==> /etc/rc.d/init.d/atd <==


#!/bin/bash
#
# /etc/rc.d/init.d/atd
#
# Starts the at daemon

...

Así como con el paginador less de arriba, la salida de comandos largos se puede truncar al
establecer una tubería en el comando head.

[student@station student]$ ps aux | head -5


USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 2500 416 ? S 10:51 0:03 init [5]
root 2 0.0 0.0 0 0 ? SW 10:51 0:00 [keventd]
root 3 0.0 0.0 0 0 ? SW 10:51 0:00 [kapmd]
root 4 0.0 0.0 0 0 ? SWN 10:51 0:00
[ksoftirqd/0]
[student@station student]$

El comando tail
53

Filesystem basics

tail [OPCIONES] [ARCHIVO...]

Para complementar head, el comando tail muestra las últimas 10 líneas de cada FILE a la
salida estándar.

Opción Efecto
-num, -n num Muestra las últimas num líneas (por defecto es 10).
-q Suprime encabezados que dan nombres de archivo
-f Mantiene el archivo abierto y escribe las nuevas líneas como añadidas

En el siguiente ejemplo, elvis escribe las últimas 10 líneas y después las ultimas 5 del
archivo /etc/group.

[elvis@station elvis]$ tail /etc/group


named:x:25:
gdm:x:42:
postgres:x:26:
apache:x:48:
postdrop:x:90:
postfix:x:89:
squid:x:23:
webalizer:x:67:
ldap:x:55:
elvis:x:500:
[elvis@station elvis]$ tail -n 5 /etc/group
postfix:x:89:
squid:x:23:
webalizer:x:67:
ldap:x:55:
elvis:x:500:

El comando tail tiene otra opción bastante útil: la opción -f (follow). Con esta opción tail
mostrará las últimas líneas del archivo y luego "espera" y continua presentando cualquier
nueva línea al ser añadida al archivo. Frecuentemente, se utiliza para monitorear archivos
de registro en tiempo real. Una vez inicie con esta opción, el intérprete de comandos no
retorna. En su lugar, tail -f se mantiene activa y continuará presentando las nuevas líneas
hasta que se presione CTRL-C.

Ejemplos

Identificación de documentos con file

Al explorar la configuración del sistema de impresión cups, prince se encontró con los
siguientes archivos en el directorio /usr/share/cups/banners.
54

Filesystem basics
[prince@station banners]$ ls /usr/share/cups/banners/
classified confidential secret standard topsecret unclassified

Como no está seguro de qué tipo de archivos son, trata entonces de identificarlos con el
comando file.

[prince@station banners]$ cd /usr/share/cups/banners/


[prince@station banners]$ file *
classified: PostScript document text conforming at level 3.0
confidential: PostScript document text conforming at level 3.0
secret: PostScript document text conforming at level 3.0
standard: PostScript document text conforming at level 3.0
topsecret: PostScript document text conforming at level 3.0
unclassified: PostScript document text conforming at level 3.0

El comando file revela que éstos son documentos PostScript enviados a la impresora como
pancartas.

Determinar el tipo correcto de archivo con file

El usuario elvis acaba de descargar algunas imágenes del álbum de fotos del sitio web de su
amigo y las guardó en un directorio llamado pics.

[elvis@station images]$ ls pics/


dscn0936.png dscn0942.png dscn0953.jpg
dscn0938.png dscn0952.png dscn0959.jpg

Observa las extensiones de cuatro de los archivos y parecen estar en formato PNG,
mientras que dos de ellas parecen tener formato JPEG. Al parecerle extraño, confirma el
tipo de archivos ejecutando el comando file.

[elvis@station images]$ file pics/*


pics/dscn0936.png: PNG image data, 360 x 480, 8-bit/color RGB, non-
interlaced
pics/dscn0938.png: PNG image data, 640 x 480, 8-bit/color RGB, non-
interlaced
pics/dscn0942.png: PNG image data, 360 x 480, 8-bit/color RGB, non-
interlaced
pics/dscn0952.png: PNG image data, 360 x 480, 8-bit/color RGB, non-
interlaced
pics/dscn0953.jpg: PNG image data, 640 x 480, 8-bit/color RGB, non-
interlaced
pics/dscn0959.jpg: PNG image data, 640 x 480, 8-bit/color RGB, non-
interlaced

Los últimos dos archivos están en formato PNG como los otros cuatro. Aparentemente, los
dos últimos fueron nombrados con una extensión equivocada.

Hojear archivos con head


55

Filesystem basics

La usuaria blondie recientemente aprendió que todos los archivos del directorio
/etc/profile.d terminados en .sh se encuentran incluidos en su configuración de shell
bash cada vez que inicia sesión. Interesada en saber lo que contienen los archivos decide
hojear las primeras líneas de cada archivo con el siguiente comando.

[blondie@station blondie]$ head /etc/profile.d/*.sh

==> /etc/profile.d/glib2.sh <==


## This caused GLib2 applications to convert filenames from
## locale encoding to UTF-8. If the locale encoding is already
## UTF-8 then it makes no difference.

export G_BROKEN_FILENAMES=1
==> /etc/profile.d/gnome-ssh-askpass.sh <==
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
export SSH_ASKPASS

==> /etc/profile.d/jdk.sh <==


export PATH=/usr/local/j2sdk1.3.1/bin:$PATH

==> /etc/profile.d/lang.sh <==


# /etc/profile.d/lang.sh - set i18n stuff

sourced=0
for langfile in /etc/sysconfig/i18n $HOME/.i18n ; do
[ -f $langfile ] && . $langfile && sourced=1
done

if [ -n "$GDM_LANG" ]; then
sourced=1
LANG="$GDM_LANG"

...

Combinación de archivos múltiples en un sólo archivo con head

La usuaria madonna está aprendiendo sobre PAM, los módulos de autenticación


conectables de Linux. Acaba de descubrir el directorio /usr/share/doc/pam-0.75/txts,
el cual contiene un gran número de archivos README.

[madonna@station madonna]$ cd /usr/share/doc/pam-0.75/txts/


[madonna@station txts]$ ls
pam_appl.txt README.pam_ftp README.pam_shells
pam_modules.txt README.pam_limits README.pam_stack
pam.txt README.pam_listfile README.pam_stress
README README.pam_localuser README.pam_tally
README.pam_access README.pam_mail README.pam_time
README.pam_chroot README.pam_nologin README.pam_timestamp
README.pam_console README.pam_permit README.pam_unix
README.pam_cracklib README.pam_pwdb README.pam_userdb
README.pam_deny README.pam_rhosts README.pam_warn
56

Filesystem basics
README.pam_env README.pam_rootok README.pam_wheel
README.pam_filter README.pam_securetty README.pam_xauth

En vez de examinar cada archivo individualmente ella quisiera combinarlos en un sólo


archivo para poderlo navegar fácilmente. Sabe que puede utilizar el comando cat y
redireccionar la salida al archivo, pero ya no sabría los nombres de archivos asociados con
cada uno de estos archivos. En su lugar, decide utilizar el comando head, dándole un
número absurdo de líneas a seleccionar. De esa manera, podrá navegar el contenido de los
archivos con un aviso identificador otorgando el nombre de archivo.

[madonna@station txts]$ head -99999 README* > /tmp/pam_READMEs.txt


[madonna@station txts]$ less /tmp/pam_READMEs.txt
==> README <==
$Id: 010_text.dbk,v 1.1.1.1 2003/08/11 13:18:31 bowe Exp $

This is a directory for text versions of the pam documentation

==> README.pam_access <==


# Description of its configuration file
#
# (The default config file is "/etc/security/access.conf". This
# default can be overridden with a module config argument
...

Monitoría de archivos múltiples con tail

En Red Hat Enterprise Linux, los eventos del sistema se registran en archivos de texto que
se encuentran en el directorio /var/log tales como /var/log/messages (para eventos del
sistema en general) y /var/log/secure (para aquellos eventos que incluyen información
importante). Cuando los eventos ocurren se añaden nuevas líneas a estos archivos en
tiempo real.

Suponga que un administrador de sistemas quisiera observar ambos archivos de registro y


ver la nueva información tan pronto como llega. Ella utiliza el comando tail -f para seguir
el final de ambos archivos. El comando tail inmediatamente presenta las últimas 10 líneas
de ambos archivos, decoradas por el nombre de archivo.

[root@station root]# cd /var/log


[root@station log]# tail -f messages secure

==> messages <==


Jun 25 11:20:59 station kernel: 11: @cf13e4c0 length 800000de status
800100de
Jun 25 11:20:59 station kernel: 12: @cf13e500 length 800000de status
000100de
Jun 25 11:20:59 station kernel: 13: @cf13e540 length 80000042 status
00010042
Jun 25 11:20:59 station kernel: 14: @cf13e580 length 800005ea status
000105ea
57

Filesystem basics
Jun 25 11:20:59 station kernel: 15: @cf13e5c0 length 8000031e status
0001031e
Jun 25 11:22:06 station su(pam_unix)[2229]: session closed for user
madonna
Jun 25 11:22:10 station su(pam_unix)[2352]: session opened for user root
by elvis(uid=2291)
Jun 25 11:23:06 station su(pam_unix)[2399]: session opened for user root
by elvis(uid=2291)
Jun 25 11:23:55 station su(pam_unix)[2399]: session closed for user root
Jun 25 11:24:00 station su(pam_unix)[2441]: session opened for user elvis
by elvis(uid=2291)

==> secure <==


Jun 24 15:32:15 station sshd[11535]: Accepted publickey for root from
127.0.0.1
port 36253 ssh2
Jun 24 15:32:15 station sshd[11545]: Accepted publickey for root from
127.0.0.1
port 36254 ssh2
Jun 24 15:32:16 station sshd[11555]: Accepted publickey for root from
127.0.0.1
port 36256 ssh2
Jun 24 17:00:22 station sshd[819]: Received signal 15; terminating.
Jun 24 17:29:05 localhost sshd[792]: Server listening on 0.0.0.0 port 22.
Jun 24 17:30:49 localhost xinetd[803]: START: sgi_fam pid=1322 from=<no
address>Jun 24 19:24:47 localhost xinetd[803]: START: sgi_fam pid=3175
from=<no address>Jun 25 08:43:54 localhost sshd[792]: Received signal 15;
terminating.
Jun 25 10:06:28 station sshd[834]: Server listening on 0.0.0.0 port 22.
Jun 25 10:09:01 station xinetd[845]: START: sgi_fam pid=1134 from=<no
address>

En este punto, el comando tail sigue ejecutándose, pero la salida hace una pausa hasta que
ocurre un nuevo evento en el sistema, el cual se registra en uno de los archivos. Después el
comando tail muestra las nuevas lineas añadidas decoradas con el nombre de archivo del
archivo pertinente.

==> messages <==


Jun 25 11:24:54 station su(pam_unix)[2481]: session opened for user root
by elvis (uid=501)
Jun 25 11:25:02 station su(pam_unix)[2481]: session closed for user root

Finalmente, cuando el administrador ha terminado de observar los archivos cancela el


comando tail con la secuencia CTRL-C.

Ejercicios en línea

Navegar archivos de texto


58

Filesystem basics

Lab Exercise
Objetivo: Examinar archivos usando varias utilidades para navegar.

Tiempo estimado: 15 minutos.

Especificaciones

En este ejercicio necesitará tres terminales (ya sean consolas virtuales o terminales dentro
del entorno gráfico X) cada una utilizando su cuenta primaria.

1. En la primera terminal, cat el contenido del archivo /etc/services incluyendo la


opción correcta para numerar todas las líneas. Despues de ver el resultado, repita el
comando (con la misma opción) redireccionando la salida al archivo
services.cat.txt en su directorio de inicio.
2. Mientras esté en la primera terminal haga un listado recursivo de todos los archivos
con el comando ls -R / y atrape la salida (utilizando una tubería) con el paginador
less. Use los comandos básicos del paginador tales como ESPACIO y b para
navegar la salida. Explore otros comandos del paginador utilizando el comando h
para abrir una ventana de ayuda.

Cuando haya terminado, NO salga del paginador less, vaya a una nueva terminal
para realizar el siguiente paso.

3. En la segunda terminal, use el comando head para ver las primeras 5 líneas de todos
los archivos en el directorio /etc/sysconfig cuyo nombre empieza por system- al
archivo confheaders.txt en su directorio de inicio. Utilice la opción apropiada
para suprimir los encabezados con los nombres de archivos que head imprime por
defecto.
4. Al seguir en la segunda terminal, ejecute el comando vmstat 1. Este comando traza
las estadísticas de la memoria y la CPU de su máquina generando una línea una vez
por segundo. Cuando haya visto lo suficiente, utilice la secuencia CTRL-C para
matar el comando.

Ejecute el comando de nuevo, esta vez redireccionando la salida al archivo


vmstat.out en su directorio de inicio como se muestra a continuación.

[elvis@station elvis]$ vmstat 1 > vmstat.out

NO pare este comando, déjelo ejecutando. Vaya a una nueva terminal para realizar
el siguiente paso.

5. En una tercera terminal siga el creciente archivo vmstat.out con el comando tail -
f. NO pare el comando tail hasta no haber confirmado el siguiente ejercicio.
59

Filesystem basics

Deliverables

Question 1

1. Un archivo en su directorio de inicio llamado services.cat.txt, el cual contiene


el contenido del archivo /etc/services con líneas numeradas producidas por el
comando cat.
2. Un paginador less ejecutando, el cual se encuentra utilizando una tubería para
navegar la salida del comando ls -R /.
3. El archivo confheaders.txt en su directorio de inicio, el cual contiene las
primeras cinco líneas de cada archivo en /etc/sysconfig comenzando por
redhat-, como lo produjo el comando head, suprimiendo los nombres de archivos
(con la opción u opciones apropiadas de la línea de comandos).
4. Un comando tail en ejecución seguido del creciente archivo vmstat.out en su
directorio de inicio.

Limpieza

Después de completar este ejercicio salga del paginador less con el comando q y termine
los comandos vmstat y tail con la secuencia de controlCTRL-C.

Capítulo 7 Modificación de archivos

Conceptos clave

• Un editor de textos no es un procesador de palabras.


• Linux se envía con muchos editores de texto
• nano es un editor de texto de la línea de comandos comúnmente usado.
• gedit es un editor de texto gráfico comúnmente usado.

Editor de texto vs. Procesador de palabras

Una de las maneras en que Linux alcanza su alto nivel de flexibilidad es por medio de la
robustez de su configuración. Usualmente la información sobre la configuración se
60

Filesystem basics

encuentra almacenada en archivos de texto ASCII. Con frecuencia la administración de


sistemas involucra la actualización o corrección de estos archivos de configuración. La
herramienta para lograr esto es un editor de texto.

Un editor de texto no es lo mismo que un procesador de palabras. Además de las palabras


de un documento, el procesador de palabras permite al usuario especificar tipos de letra,
configuraciones del tabulador, márgenes, justificaciones y muchas otras características
diseñadas para modificar la manera en que un documento se ve en el papel. Los
documentos generados por procesadores de palabras contienen códigos binarios que
especifican la configuración de estas características adicionales. Un archivo de texto plano
tal como un archivo de configuración no contiene tales códigos y no está diseñado para
imprimirlo en papel. Un editor de texto está diseñado sólo para modificar el contenido del
texto de un archivo ASCII plano y no contiene ningún código binario.

Un procesador de palabras sería una opción apropiada para escribir una carta, un memo, un
boletín, un folleto o cualquier documento en donde la presentación visual sea controlada
por el software de edición.

Un editor de texto es la opción apropiada para crear o modificar archivos de configuración,


código fuentes de programas, documentación del sistema o cualquier documento (así como
documentos HTML) en donde la presentación visual es controlada por el software (tal
como un navegador de web) y no por el software de edición. Debido a que este curso se
enfoca en la administración de sistemas Linux, los editores de texto serán nuestra
herramienta en la mayoría de los casos.

Editores de texto en Linux

Linux viene junto con un juego completo de editores de texto, cada uno con sus fortalezas y
debilidades. Linux también incluye procesadores de palabra para la creación de documentos
como parte de productos tales como OpenOffice.

Como todos los editores de texto trabajan en archivos de texto sencillos, puede escoger el
que quiera sin problemas de compatibilidad entre los productos. Normalmente se escoge
una opción con base en la disponibilidad, facilidad de uso, familiaridad y características
especiales. Por ejemplo, algunos editores facilitan la generación de código de programas
formateados de manera correcta haciendo que la programación sea mucho más fácil y
rápida. Este capítulo presenta dos editores fáciles de utilizar nano y gedit. El editor de
texto más popular en los sistemas Linux es vi y también es el más robusto y el más
complicado. La complejidad de este editor hace difícil abordarlo en un curso introductorio.

nano

nano es un editor de texto simple que presenta una pantalla completa. Los comandos se
presentan al final de la pantalla y se proporciona ayuda de acuerdo con el contexto. Al
escribir los caracteres estos se insertan de manera inmediata en el texto.
61

Filesystem basics

Uso:

nano [OPCIONES] [ARCHIVO]

Abre el ARCHIVO en modo de edición.

Como se mencionó anteriormente el comando nano se presenta al final de la pantalla


durante la sesión de edición, lo cual hace muy fácil recordar los comandos de edición. Los
comandos primarios de nano se encuentran resumidos abajo. Allí hallará que el símbolo
circunflejo (^), seguido de una letra se utiliza para representar combinaciones de Ctrl-tecla,
así que ^K representa la combinación de CTRL-K.

Table 1. Los comandos de nano

Comando Función
^G Ayuda - abre una pequeña ventana de ayuda
^X Salir - sale (y opcionalmente guarda el archivo)
^O Escribir - guarda el archivo
^J Justificar
^R Leer el archivo - e insertar en la posición del cursor
^W Dónde está - búsqueda de texto
^Y Página anterior -retrocede una página
^V Próxima página - adelanta una página
^K Cortar texto - corta una línea a la vez
^U Deshace el corte de texto - inserta el último bloque de texto cortado
^C Posición del cursor- identifica el número de línea y de columna
^T Corrector ortográfico - empieza a corregir la ortografía

Table 2. Opciones especiales de nano

Opción Función
-w desactiva el ajuste de texto
-v "ver" el archivo en modo de sólo-lectura

Los archivos de configuración pueden sufrir daños debido a cortes de línea indebidos, así
que con frecuencia se inicianano con la opción-w para editar estos archivos.

gedit
62

Filesystem basics

gedit es un editor gráfico de texto disponible para el entorno de X-window. Se puede


acceder a él entrando gedit en el intérprete de comandos de una terminal o seleccionando
Accesorios -> Editor de texto del menú de GNOME. Proporciona una interfaz familiar de
documentos para crear y modificar archivos de texto e iconos de barras de herramientas
para acceder a características tales como búsqueda y remplazo, cortar-copiar -pegar, e
imprimir. Esta ventana cuenta con pestañas que permiten abrir más de un documento a la
vez. También soporta una interfaz estándar para interactuar con el sistema de archivos.

Figure 1. El editor gráfico de textos gedit

Ejercicios en línea

Editores de texto

Lab Exercise
Objetivo: Editores de texto

Estimated Time: 10 mins.

Especificaciones

El archivo /etc/services es un ejemplo de un archivo de texto de configuración ASCII


de Linux. En este laboratorio tendrá que hacer dos copias de este archivo y modificar uno
utilizando el editor de texto nano y modificar el otro utilizando el editor de textos gráfico
63

Filesystem basics

gedit. Si su sistema no tiene instalado el servidor X, utilice el editor nano para ambos
archivos.

El editor nano

1. En su directorio de inicio cree una copia del archivo /etc/services llamado


services.nano
2. Abra el archivo services.nano utilizando el editor de textos nano.
3. Al usar las secuencias de control especificadas al final de la pantalla, busque y borre
todas las ocurrencias del caracter +. Mantenga los espacios de las columnas y
guarde su archivo como services.noplus.
4. Continuando en la misma sesión de edición mueva su cursor a la línea 140. La
combinación CTRL-C le informará el número de línea actual (observe que CTRL-
C, el comando que usualmente termina un proceso, ha sido sobrescrito por el editor
nano y tiene un nuevo comportamiento). Borre esa línea y la siguiente. Guarde su
archivo como services.nonext.
5. Cierre el editor nano.

El editor gedit

1. En su directorio de inicio cree una copia del archivo /etc/services llamado


services.gedit
2. Abra el archivo services.gedit utilizando el editor de texto gedit.
3. Mueva su cursor a la línea número 100 (el explorar un poco el menú de gedit le
puede simplificar esta tarea). Borre toda la línea y las dos siguientes. Guarde su
archivo como services.notsmux.
4. Remplace toda ocurrencia de la letra tcp con udp. Realice la búsqueda y remplace
teniendo en cuenta mayúsculas y minúsculas (por ejemplo, no remplace TCP).
Guarde su archivo como services.notcp.
5. Cierre el editor gedit.

Deliverables

Question 1

Debe crear todos los archivos en su directorio de inicio.

1. Un archivo llamado services.noplus, el cual es un duplicado del archivo


/etc/services con los caracteres + borrados.
2. Un archivo llamado services.nonext, el cual además de la modificación anterior
ha suprimido las líneas número 140 y 141.
3. Un archivo services.notsmux, el cual es el duplicado del archivo
/etc/servicessin las líneas 100, 101 y 102 suprimidas.
64

Filesystem basics

4. Un archivo llamado services.notcp, el cual además de la modificación anterior ha


remplazado todas las presencias de los caracteres tcp con udp.

También podría gustarte