2 filesystem basics

64
Filesystem basics 1 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 | |

Transcript of 2 filesystem basics

Page 1: 2 filesystem basics

Filesystem basics

1

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 , forms y 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 | |

Page 2: 2 filesystem basics

Filesystem basics

2

-- 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.midi de 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

Page 3: 2 filesystem basics

Filesystem basics

3

ú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

Page 4: 2 filesystem basics

Filesystem basics

4

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.

Page 5: 2 filesystem basics

Filesystem basics

5

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

Page 6: 2 filesystem basics

Filesystem basics

6

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.

Page 7: 2 filesystem basics

Filesystem basics

7

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.

Page 8: 2 filesystem basics

Filesystem basics

8

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

Page 9: 2 filesystem basics

Filesystem basics

9

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

Page 10: 2 filesystem basics

Filesystem basics

10

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

Page 11: 2 filesystem basics

Filesystem basics

11

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)

Page 12: 2 filesystem basics

Filesystem basics

12

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 0 8:04 orbit-alice drwx------ 2 alice alice 4096 Mar 16 0 7:07 ssh-XXDg4ke3 [alice@station tmp]$ touch newfile [alice@station tmp]$ ls -l total 8 -rw-rw-r-- 1 alice alice 0 Mar 16 1 4:14 newfile drwx------ 2 alice alice 4096 Mar 16 0 8:04 orbit-alice drwx------ 2 alice alice 4096 Mar 16 0 7: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

Page 13: 2 filesystem basics

Filesystem basics

13

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

Page 14: 2 filesystem basics

Filesystem basics

14

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.

Page 15: 2 filesystem basics

Filesystem basics

15

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.stude nt [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.

Page 16: 2 filesystem basics

Filesystem basics

16

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.

Page 17: 2 filesystem basics

Filesystem basics

17

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 >> greeti ngs.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}

Page 18: 2 filesystem basics

Filesystem basics

18

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

Page 19: 2 filesystem basics

Filesystem basics

19

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.

Page 20: 2 filesystem basics

Filesystem basics

20

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

Page 21: 2 filesystem basics

Filesystem basics

21

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

Page 22: 2 filesystem basics

Filesystem basics

22

[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

Page 23: 2 filesystem basics

Filesystem basics

23

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

Page 24: 2 filesystem basics

Filesystem basics

24

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 phot o2.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:

Page 25: 2 filesystem basics

Filesystem basics

25

[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.ht ml [student@station student]$ mv index.html html [student@station student]$ mv html public_html [student@station student]$ cp public_html/index.htm l archive [student@station student]$ ls public_html index.html [student@station student]$ ls archive index.html

Investigar la opción "noclobber"

Page 26: 2 filesystem basics

Filesystem basics

26

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

Page 27: 2 filesystem basics

Filesystem basics

27

[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 dir ectory).

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

Page 28: 2 filesystem basics

Filesystem basics

28

[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/advertis ing [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.

Page 29: 2 filesystem basics

Filesystem basics

29

[hogan@station hogan]$ ls -R /etc/sysconfig/network ing/ /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 dir ectorio).

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

Page 30: 2 filesystem basics

Filesystem basics

30

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 |

Page 31: 2 filesystem basics

Filesystem basics

31

hogan -- website -- -- forms | | -- song 1.midi | | | -- songs -- | | | | | -- song 2.midi | | -- media -- | -- pict ure1.png | | -- photos-- | -- pict ure2.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 | | | | -- s ong1.midi | | | | | -- songs -- | | | | | | | -- s ong2.midi | | | | -- media -- | | -- p icture1.png | | | hogan -- -- photos-- | | | -- p icture2.png | | -- html | | -- archive -- -- forms | | -- s ong1.midi | | | -- songs -- | | | | | -- s ong2.midi | | -- media -- | -- p icture1.png | | -- photos--

Page 32: 2 filesystem basics

Filesystem basics

32

| -- p icture2.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 | | | | -- s ong1.midi | | | | | -- songs -- | | | | | | | -- s ong2.midi | | | | -- media -- | | -- p icture1.png | | | hogan -- -- photos-- | | | -- p icture2.png

Page 33: 2 filesystem basics

Filesystem basics

33

| | -- html | | -- archive -- website -- -- forms | | -- song1.midi | | | -- so ngs -- | | | | | -- song2.midi | | -- media -- | -- picture1.png | | -- ph otos-- | -- 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 | | -- song 1.midi | | | -- songs -- | | | | | -- song 2.midi | | -- media -- | -- pict ure1.png | | -- photos-- | -- pict ure2.png

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

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

Page 34: 2 filesystem basics

Filesystem basics

34

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 .

Page 35: 2 filesystem basics

Filesystem basics

35

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

Page 36: 2 filesystem basics

Filesystem basics

36

[ventura@station ventura]$ cp -r /usr/share/doc/pyg tk2-1.99.16/examples/

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

examples/: atk gl glade gobject ide neil pango pygtk-de mo 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.

Page 37: 2 filesystem basics

Filesystem basics

37

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

Page 38: 2 filesystem basics

Filesystem basics

38

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

Page 39: 2 filesystem basics

Filesystem basics

39

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

Page 40: 2 filesystem basics

Filesystem basics

40

[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

Page 41: 2 filesystem basics

Filesystem basics

41

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.

Page 42: 2 filesystem basics

Filesystem basics

42

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_ht ml

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

Page 43: 2 filesystem basics

Filesystem basics

43

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/pnm2p pa.conf /etc/aeplog.conf /etc/libuser.conf /etc/pwdb. conf /etc/cdrecord.conf /etc/logrotate.conf /etc/resol v.conf /etc/esd.conf /etc/lpd.conf /etc/rndc. conf /etc/fam.conf /etc/ltrace.conf /etc/scrol lkeeper.conf /etc/gpm-root.conf /etc/modprobe.conf /etc/sysc tl.conf /etc/grub.conf /etc/mtools.conf /etc/syslo g.conf /etc/host.conf /etc/named.conf /etc/updat edb.conf /etc/initlog.conf /etc/nscd.conf /etc/updfs tab.conf /etc/jwhois.conf /etc/nsswitch.conf /etc/warnq uota.conf /etc/krb5.conf /etc/ntp.conf /etc/webal izer.conf /etc/krb.conf /etc/pam_smb.conf /etc/wvdia l.conf /etc/ldap.conf /etc/pbm2ppa.conf /etc/xinet d.conf /etc/ld.so.conf /etc/pine.conf /etc/yp.co nf

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 lib algo.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

Page 44: 2 filesystem basics

Filesystem basics

44

/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/libo sp.a /usr/lib/librle.a /usr/lib/libanl.a /usr/lib/libgif.a /usr/lib/libp am.a /usr/lib/librpm.a /usr/lib/libapm.a /usr/lib/libgmp.a /usr/lib/libp bm.a /usr/lib/libSDL.a /usr/lib/libbfd.a /usr/lib/libgpm.a /usr/lib/libp ci.a /usr/lib/libssl.a /usr/lib/libbsd.a /usr/lib/libgtk.a /usr/lib/libp gm.a /usr/lib/libttf.a /usr/lib/libefs.a /usr/lib/libIDL.a /usr/lib/libp ng.a /usr/lib/libusb.a /usr/lib/libesd.a /usr/lib/libnsl.a /usr/lib/libp nm.a /usr/lib/libxml.a /usr/lib/libgal.a /usr/lib/libogg.a /usr/lib/libp pm.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

Page 45: 2 filesystem basics

Filesystem basics

45

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 m an9 pl ru sv de es fr_FR id ja man2 man4 man6 man8 m ann 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

Page 46: 2 filesystem basics

Filesystem basics

46

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.e nc cp949.enc cp852.enc cp860.enc cp863.enc cp866.enc cp932.e nc cp950.enc cp855.enc cp861.enc cp864.enc cp869.enc cp936.e nc cp_thousand: cp1250.enc cp1252.enc cp1254.enc cp1256.enc cp1 258.enc

Page 47: 2 filesystem basics

Filesystem basics

47

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 m acThai.enc macCroatian.enc macGreek.enc macRoman.enc m acTurkish.enc macCyrillic.enc macIceland.enc macRomania.enc m acUkraine.enc xxxn: big5.enc iso8859-13.enc iso8859-2.enc iso8 859-7.enc jis0212.enc iso2022.enc iso8859-14.enc iso8859-3.enc iso8 859-8.enc koi8-r.enc iso2022-jp.enc iso8859-15.enc iso8859-4.enc iso8 859-9.enc koi8-u.enc iso2022-kr.enc iso8859-16.enc iso8859-5.enc jis0 201.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/ma c* 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

Page 48: 2 filesystem basics

Filesystem basics

48

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 maile r index.html: HTML document text novel.ps: PostScript document text confor ming at level 3.0 mailer: perl script text executable

Ejemplo de uso con archivos binarios:

[nero@station nero]$ file logo.jpeg symphony.mp3 ar chive.tgz logo.png: PNG image data, 387 x 69, 8-bit grayscale, non-interlaced symphony.mp3: MP3, 128 bits, 44.1 kHz, JStere o 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

Page 49: 2 filesystem basics

Filesystem basics

49

Opción Efecto

-A Muestra todos los caracteres incluyendo los caracteres de control y los de no 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

Page 50: 2 filesystem basics

Filesystem basics

50

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 S TART TIME COMMAND root 1 0.0 0.0 1392 92 ? S 1 7:27 0:04 init [

Page 51: 2 filesystem basics

Filesystem basics

51

root 2 0.0 0.0 0 0 ? SW 1 7:27 0:00 [keventd] root 3 0.0 0.0 0 0 ? SW 1 7:27 0:00 [kapmd] root 4 0.0 0.0 0 0 ? SWN 1 7:27 0:00 [ksoftirqd_CPU0] root 9 0.0 0.0 0 0 ? SW 1 7: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

Page 52: 2 filesystem basics

Filesystem basics

52

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 copr ocessor 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 S TART TIME COMMAND root 1 0.0 0.1 2500 416 ? S 1 0:51 0:03 init [5] root 2 0.0 0.0 0 0 ? SW 1 0:51 0:00 [keventd] root 3 0.0 0.0 0 0 ? SW 1 0:51 0:00 [kapmd] root 4 0.0 0.0 0 0 ? SWN 1 0:51 0:00 [ksoftirqd/0] [student@station student]$

El comando tail

Page 53: 2 filesystem basics

Filesystem basics

53

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 .

Page 54: 2 filesystem basics

Filesystem basics

54

[prince@station banners]$ ls /usr/share/cups/banner s/ classified confidential secret standard topsecr et 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/banner s/ [prince@station banners]$ file * classified: PostScript document text conforming a t level 3.0 confidential: PostScript document text conforming a t level 3.0 secret: PostScript document text conforming a t level 3.0 standard: PostScript document text conforming a t level 3.0 topsecret: PostScript document text conforming a t level 3.0 unclassified: PostScript document text conforming a t 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

Page 55: 2 filesystem basics

Filesystem basics

55

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 filena mes 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 ; d o [ -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.p am_shells pam_modules.txt README.pam_limits README.p am_stack pam.txt README.pam_listfile README.p am_stress README README.pam_localuser README.p am_tally README.pam_access README.pam_mail README.p am_time README.pam_chroot README.pam_nologin README.p am_timestamp README.pam_console README.pam_permit README.p am_unix README.pam_cracklib README.pam_pwdb README.p am_userdb README.pam_deny README.pam_rhosts README.p am_warn

Page 56: 2 filesystem basics

Filesystem basics

56

README.pam_env README.pam_rootok README.p am_wheel README.pam_filter README.pam_securetty README.p am_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 bow e Exp $ This is a directory for text versions of the pam do cumentation ==> 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 a rgument ...

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 le ngth 800000de status 800100de Jun 25 11:20:59 station kernel: 12: @cf13e500 le ngth 800000de status 000100de Jun 25 11:20:59 station kernel: 13: @cf13e540 le ngth 80000042 status 00010042 Jun 25 11:20:59 station kernel: 14: @cf13e580 le ngth 800005ea status 000105ea

Page 57: 2 filesystem basics

Filesystem basics

57

Jun 25 11:20:59 station kernel: 15: @cf13e5c0 le ngth 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 publi ckey for root from 127.0.0.1 port 36253 ssh2 Jun 24 15:32:15 station sshd[11545]: Accepted publi ckey for root from 127.0.0.1 port 36254 ssh2 Jun 24 15:32:16 station sshd[11555]: Accepted publi ckey 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 listeni ng on 0.0.0.0 port 22. Jun 24 17:30:49 localhost xinetd[803]: START: sgi_f am pid=1322 from=<no address>Jun 24 19:24:47 localhost xinetd[803]: STAR T: 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

Page 58: 2 filesystem basics

Filesystem basics

58

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.

Page 59: 2 filesystem basics

Filesystem basics

59

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

Page 60: 2 filesystem basics

Filesystem basics

60

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.

Page 61: 2 filesystem basics

Filesystem basics

61

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

Page 62: 2 filesystem basics

Filesystem basics

62

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

Page 63: 2 filesystem basics

Filesystem basics

63

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/services sin las líneas 100, 101 y 102 suprimidas.

Page 64: 2 filesystem basics

Filesystem basics

64

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.