CAPITULO 5

Ayuda en Linux

Comprender los Archivos y los Directorios

Los archivos se utilizan para almacenar datos tales como texto, gráficos y programas. Los directorios (También conocidos como «carpetas») se utilizan para proporcionar una estructura de organización jerárquica. Esta estructura es algo diferente a la que puedes estar acostumbrado si previamente trabajaste en los sistemas de Windows.

En un sistema Windows, el nivel superior de la estructura de directorios se llama Este Equipo. Cada dispositivo físico (disco duro, unidad de DVD, unidad USB, unidad de red, etc.) aparece en Este Equipo, cada uno asignado a una letra de unidad como C: o D:. Una representación visual de esta estructura:

Igual que Windows, la estructura de directorios de Linux tiene un nivel superior, sin embargo no se llama Este Equipo, sino directorio raíz y su símbolo es el carácter / . También, en Linux no hay unidades; cada dispositivo físico es accesible bajo un directorio, no una letra de unidad. Una representación visual de una estructura de directorios típica de Linux:

La mayoría de los usuarios de Linux denominan esta estructura de directorios el sistema de archivosPara ver el sistema de archivos raíz, introduce ls / y Observa que hay muchos directorios descriptivos incluyendo /boot, que contiene los archivos para arrancar la computadora.

El Directorio Path

Usando el gráfico en la sección anterior como un punto de referencia, verás que hay un directorio llamado sound bajo el directorio llamado etc, que se encuentra bajo el directorio /. Una manera más fácil de decir esto es refiriéndose a la ruta.

En las distribuciones modernas de Linux, el directorio /etc por lo general contiene los archivos de configuración estática como lo define por el Estándar de Jerarquía de Archivos (o «FHS», del inglés «Files Hierarchy Standard»).

Una ruta de acceso te permite especificar la ubicación exacta de un directorio. Para el directorio sound la ruta de acceso sería /etc/sound. El primer carácter / representa el directorio root (o «raíz» en español), mientras que cada siguiente carácter / se utiliza para separar los nombres de directorio.

Este tipo de ruta se llama la ruta absoluta (o «aboslute path» en inglés). Con una ruta absoluta, siempre proporcionas direcciones a un directorio (o un archivo) a partir de la parte superior de la estructura de directorios, el directorio root. Más adelante en este capítulo cubriremos un tipo diferente de la ruta llamada la ruta relativa (o «relative path» en inglés). La siguiente gráfica muestra tres rutas absolutas adicionales:

El Directorio Home

En la mayoría de las distribuciones de Linux hay un directorio llamado home bajo el directorio root/homeBajo de este directorio /home hay un directorio para cada usuario del sistema. El nombre del directorio será el mismo que el nombre del usuario, por lo que un usuario llamado «laprovittera» tendría un directorio home llamado /home/laprovittera.

Tu directorio home es un directorio muy importante. Para empezar, cuando abres un shell automáticamente te ubicarás en tu directorio home, en donde harás la mayor parte de tu trabajo.

El directorio home es uno de los pocos directorios donde tienes el control total para crear y eliminar los archivos adicionales. La mayor parte de otros directorios en un sistema de archivos de Linux están protegidos con file permissions.

En la mayoría de las distribuciones de Linux, los únicos usuarios que pueden acceder a los archivos en tu directorio home eres tú y el administrador del sistema (el usuario root). Esto se puede cambiar utilizando los permisos de archivo.

Tu directorio tiene incluso un símbolo especial que puedes usar para representarlo: ~. Si tu directorio home es /home/sysadmin, puedes simplemente introducir ~ en la línea de comandos en lugar de /home/sysadmin. También puedes referirte al directorio home de otro usuario usando la notación ~usuario, donde usuario es el nombre de la cuenta de usuario cuyo directorio home quieres consultar. Por ejemplo, ~laprovittera sería igual a /home/laprovittera.

Ten en cuenta que una lista revela los subdirectorios contenidos en el directorio home. Cambiar directorios requiere atención al detalle. En los entornos de Linux son sensibles a mayúsculas y minúsculas. Cambiarnos al directorio Downloads requiere que la ortografía sea correcta – incluyendo la letra D mayúscula

Directorio Actual y Cambio de Directorios

Tu directorio actual es el directorio donde estás trabajando actualmente en una terminal. Cuando primero abres una terminal, el directorio actual debe ser tu directorio home, pero esto puede cambiar mientras vas explorando el sistema de archivos y cambias a otros directorios. Puedes determinar el directorio actual mediante el comando pwd. Adicionalmente, la mayoría de los sistemas tiene el prompt que visualiza el directorio actual del usuario por defecto:

[sysadmin@localhost ~]$

El carácter ~ indica el directorio actual.  Normalmente el sistema sólo muestra el nombre del directorio actual, no la ruta completa del directorio raíz hacia abajo. En otras palabras, si estuvieras en el directorio /usr/share/doc , tu prompt probablemente te proporcionará solamente el nombre doc el directorio actual. Si quieres la ruta completa, utiliza el comando pwd.

Si quieres cambiar a un directorio diferente, utiliza el comando cd (cambiar directorio). Por ejemplo, el siguiente comando cambiará el directorio actual a un directorio llamado /etc

Ten en cuenta que no vas a obtener salida si el comando cd tiene éxito. Este caso es uno de los de «ninguna noticia es buena noticia». Si tratas de cambiar a un directorio que no existe, recibirás un mensaje de error.

Si quieres volver a tu directorio home, puedes introducir el comando cd sin argumentos o usar el comando cd con el carácter ~ como argumento.

Nombres de Ruta Absoluta versus Relativa

Una descripción de la ubicación de un archivo o un directorio en el sistema de archivos. También se puede entender como las direcciones que indican al sistema donde se encuentra un archivo o un directorio. Por ejemplo, el comando cd /etc/perl/Net significa «cambiar al directorio Net, que encontrarás bajo el directorio perl, que encontrarás bajo el directorio etc , que encontrarás bajo el directorio /«.

Cuando des un nombre de ruta que comienza en el directorio raíz, se llamará ruta absoluta.  Si estás en tu directorio home y quieres ir al directorio /etc/perl/Net, entonces proporcionar una ruta de acceso absoluta al comando cd tiene sentido:

Pero si estás en el directorio /etc/perl y quieres ir al directorio /etc/perl/Net sería tedioso introducir la ruta completa para llegar a un directorio que es sólo un nivel más abajo de tu ubicación actual. En una situación como ésta, vas a utilizar una ruta relativa:

Una ruta de acceso relativa proporciona direcciones usando tu ubicación actual como un punto de referencia. Recuerda que esto es diferente de las rutas absolutas, que siempre requieren que utilices el directorio raíz como punto de referencia.

Existe una técnica útil de ruta de acceso relativa que se puede utilizar para subir un nivel en la estructura de directorios: el directorio .. . Sin importar en qué directorio estás, el comando .. siempre representa un directorio arriba que el directorio actual (con la excepción de cuando estás en el directorio /):

A veces usar las rutas de acceso relativas es una mejor opción que rutas de acceso absolutas, sin embargo esto no siempre es el caso. ¿Qué pasa si estás en el directorio /etc/perl/Net y quieres ir al directorio /usr/share/doc? Utilizando una ruta absoluta, se ejecutaría el comando cd /usr/share/doc. Utilizando una ruta relativa, se ejecutaría el comando cd ../../../usr/share/doc:

Las rutas relativas y absolutas no sólo sirven para el comando cd. Siempre cuando especificas un archivo o un directorio, puedes utilizar las rutas de acceso relativas o absolutas.

Mientras que el doble punto (..) se utiliza para referirse al directorio arriba del directorio actual, el punto solo (.) se usa para referirse al directorio actual. No tendría sentido para un administrador moverse al directorio actual introduciendo cd . (aunque en realidad funciona). Es más útil referirse a un elemento en el directorio actual usando la notación ./. Por ejemplo:

Nota: Este uso del punto solo (.), como punto de referencia, no se debe confundir con su uso al principio de un nombre de archivo. 

Listado de los Archivos en un Directorio

Ahora que te puedes mover de un directorio a otro, querrás visualizar el contenido de estos directorios. El comando ls (listar) puede utilizarse para mostrar el contenido de un directorio, así como toda la información sobre los archivos que están dentro de un directorio.

Por sí mismo, el comando ls listará los archivos en el directorio actual:

Lista de los Archivos Ocultos

Cuando utilizas el comando ls para mostrar el contenido de un directorio, no todos los archivos se muestran automáticamente. El comando ls no muestra los archivos ocultos de manera predeterminada. Un archivo oculto es cualquier archivo (o directorio) que comienza con un punto ..

Para mostrar todos los archivos, incluyendo los archivos ocultos, utiliza la opción -a para el comando ls:

La mayoría de los archivos ocultos son archivos de personalización, diseñados para personalizar la forma en la que Linux, el shell o los programas funcionan. Por ejemplo, el archivo .bashrc en tu directorio home personaliza las características del shell, tales como la creación o modificación de las variables y los alias.

Estos archivos de personalización no son con los que regularmente trabajas. Hay muchos de ellos y visualizarlos hará más difícil encontrar los archivos con los que regularmente trabajas. Así que, el hecho de que están ocultos es para tu beneficio.

 

Lista de Colores

Hay muchos tipos de archivos en Linux.  Este es un breve resumen de algunos de los tipos de archivo más comunes:

TipoDescripción
plain file (archivo simple)Un archivo que no es un tipo de archivo especial; también se llama un archivo normal
directory (directorio)Un directorio de archivos (contiene otros archivos)
executable (ejecutable)Un archivo que se puede ejecutar como un programa
symbolic linkUn archivo que apunta a otro archivo (enlace simbólico)

En muchas distribuciones de Linux, las cuentas de usuario regulares son modificadas de tal manera que el comando ls muestre los nombres de archivo, codificados por colores según el tipo de archivo. Por ejemplo, los directorios pueden aparecer en azul, archivos ejecutables pueden verse en verde, y enlaces simbólicos pueden ser visualizados en cian (azul claro).

Esto no es un comportamiento normal para el comando ls, sino algo que sucede cuando se utiliza la opción --color para el comando ls. La razón por la que el comando ls parece realizar automáticamente estos colores, es que hay un alias para el comando ls para que se ejecute con la opción --color:

Cuando se ejecuta el comando ls, en realidad se ejecuta el comando ls --color=autoEn algunos casos, puede que no quieras ver todos los colores. Para evitar el uso de los alias, coloca un carácter de barra invertida \ antes de tu comando:

Listado con Visualización Larga

Existe información sobre cada archivo llamada metadata.  Esto puede incluir datos de quién es el dueño de un archivo, el tamaño y la última vez que se modificó. Puedes visualizar esta información mediante el uso de la opción -l para el comando ls:

laprovittera@localhost:~$ ls -l                                           
total 32                                                                
drwxr-xr-x 2 laprovittera laprovittera 4096 Feb 17  2022 Desktop                  
drwxr-xr-x 2 laprovittera laprovittera 4096 Feb 17  2022 Documents                
drwxr-xr-x 2 laprovittera laprovittera 4096 Feb 17 2022 Downloads
drwxr-xr-x 2 laprovittera laprovittera 4096 Feb 17 2022 Music
drwxr-xr-x 2 laprovittera laprovittera 4096 Feb 17 2022 Pictures
drwxr-xr-x 2 laprovittera laprovittera 4096 Feb 17 2022 Public
drwxr-xr-x 2 laprovittera laprovittera 4096 Feb 17 2022 Templates
drwxr-xr-x 2 laprovittera laprovittera 4096 Feb 17 2022 Videos
laprovittera@localhost:~$


En la salida anterior, cada línea describe metadatos sobre un solo archivo. A continuación se describe cada uno de los campos de datos que verás en la salida del comando 
ls -l:

Tipo de archivo. El primer carácter de cada línea de salida indica el tipo de archivo. Tipos de archivo comunes incluyen: d= directorio, -= archivo simple, l= enlace simbólico

Permisos. Los próximos nueve caracteres demostrarán los permisos del archivo. Los permisos se utilizan para determinar quién tiene acceso al archivo.

Conteo de enlaces físicos. El conteo de enlaces físicos de un archivo se usa para demostrar cuantos enlaces físicos hacia este archivo existen.

 

 

Usuario propietario. Cada archivo es propiedad de una cuenta de usuario. Esto es importante porque el propietario tiene los derechos para establecer permisos en un archivo y el propietario tiene sus propios permisos en el archivo.

Grupo propietario. Cada archivo es propiedad de un grupo. Esto es importante porque cualquier miembro de este grupo tendrá acceso especial al archivo basado en los permisos de grupo del archivo.

Tamaño de archivo. Este campo describe el tamaño de un archivo en bytes. En el caso de los directorios, este valor no describe el tamaño total del directorio, más bien, cuántos bytes están reservados para mantenerse al corriente con los nombres de archivo en el directorio (en otras palabras, ignora este campo en los directorios).

Hora de modificación. Este campo indica la última hora en la que el contenido del archivo fue modificado. En el caso de los directorios, indica la última vez que se agregó o eliminó un archivo dentro del directorio.

Nombre. El último campo es el nombre del archivo o directorio.

Tamaños Legibles

Cuando visualizas los tamaños de los archivos con la opción -l del comando 
ls obtienes los tamaños de los archivo en bytes. Para archivos de texto, un byte es 1 carácter.

Para archivos más pequeños, los tamaños en byte están bien. Sin embargo, para los archivos más grandes es difícil comprender qué tan grande es el archivo. Por ejemplo, considera la salida del siguiente comando:

laprovittera@localhost:~$ ls -l /usr/bin/omshell                                 
-rwxr-xr-c 1 root root 1561400 Oct 9 2012 /usr/bin/omshell              
laprovittera@localhost:~$

Como puedes ver, es difícil de determinar el tamaño del archivo en bytes. ¿Un archivo 1561400 es grande o pequeño? Parece bastante grande, pero es difícil de determinar su tamaño utilizando los bytes.

Piénsalo de esta manera: si alguien diera la distancia entre Gualeguaychú y Montevideo utilizando centímetros, ese valor esencialmente no tendría sentido porque una distancia como ésta la piensas en términos de kilómetros.

Sería mejor si el tamaño del archivo fuese presentado en un tamaño más fácilmente legible, tal como megabytes o gigabytes. Para lograr esto, añade la opción -h al comando ls. Importante: Debes utilizar la opción -h junto con la opción -l.

laprovittera@localhost:~$ ls -lh /usr/bin/omshell                                 
-rwxr-xr-c 1 root root 1.5M Oct 9 2012 /usr/bin/omshell              
laprovittera@localhost:~$
 

 Lista de Directorios

Cuando se utiliza el comando ls -d, se refiere al directorio actual y no al contenido dentro de él. Sin otras opciones, es algo sin sentido, aunque es importante tener en cuenta que al directorio actual siempre se refiere con un solo punto (.):

laprovittera@localhost:~$ ls -d                                            
.                                                                      

Para utilizar el comando ls -d de una manera significativa tienes que añadir la opción -l. En este caso, ten en cuenta que el primer comando muestra los detalles de los contenidos en el directorio /home/sysadmin, mientras que el segundo lista el directorio /home/sysadmin.

laprovittera@localhost:~$ ls -ld                                           
drwxr-xr-x 1 laprovittera laprovittera 512 Feb 25 17:07 .                      
sysadmin@localhost:~$

Observa el punto solo al final de la segunda lista larga. Esto indica que el directorio actual está en la lista y no el contenido.

Listado Recursivo

Habrá momentos cuando quieras visualizar todos los archivos en un directorio, así como todos los archivos en todos los subdirectorios bajo un directorio. Esto se llama listado recursivo.

Para realizar un listado recursivo, utiliza la opción -R para el comando ls:

sysadmin@localhost:~$ ls -R /etc/ppp                                         
/etc/ppp:                                                                     
chap-secrets   ip-down.ipv6to4    ip-up.ipv6to4    ipv6-up    pap-secrets
ip-down        ip-up              ipv6-down        options    peers

/etc/ppp/peers:
sysadmin@localhost:~$

Ten en cuenta que en el ejemplo anterior, los archivos en el directorio /etc/ppp se listaron primero. Después de eso, se listan los archivos en el directorio /etc/ppp/peers (no hubo ningún archivo en este caso, pero si hubiera encontrado cualquier archivo en este directorio, se habría visualizado).

Ten cuidado con esta opción; por ejemplo, ejecutando el comando ls -R / se listarían todos los archivos del sistema de archivos, incluyendo todos los archivos de cualquier dispositivo USB y DVD en el sistema. Limita el uso de la opción -R para estructuras de directorio más pequeñas.

 

Ordenar un Listado

De forma predeterminada, el comando ls ordena los archivos alfabéticamente por nombre de archivo. A veces, puede ser útil ordenar los archivos utilizando diferentes criterios. Para ordenar los archivos por tamaño, podemos utilizar la opción -S. Observa la diferencia en la salida de los dos siguientes comandos:

sysadmin@localhost:~$ ls /etc/ssh                               
moduli           ssh_host_dsa_key.pub    ssh_host_rsa_key     sshd_confi
ssh_config        ssh_host_ecdsa_key      ssh_host_rsa_key.pub        
ssh_host_dsa_key  ssh_host_ecdsa_key.pub  ssh_import_id               
sysadmin@localhost:~$ ls -S /etc/ssh                                   
moduli            ssh_host_dsa_key      ssh_host_ecdsa_key            
sshd_config       ssh_host_dsa_key.pub  ssh_host_ecdsa_key.pub         
ssh_host_rsa_key  ssh_host_rsa_key.pub                                 
ssh_config        ssh_import_id                                        
sysadmin@localhost:~$

Aparecen los mismos archivos y directorios, pero en un orden diferente. Mientras que la opción -S trabaja por sí misma, realmente no puedes decir que la salida está ordenada por tamaño, por lo que es más útil cuando se utiliza con la opción -l. El siguiente comando listará los archivos del mayor al menor y mostrará el tamaño real del archivo.

sysadmin@localhost:~$ ls -lS /etc/ssh                                  
total 160                                                             
-rw-r--r-- 1 root root 125749 Apr 29  2014 moduli                      
-rw-r--r-- 1 root root   2489 Jan 29  2015 sshd_config                
-rw------- 1 root root   1675 Jan 29  2015 ssh_host_rsa_key            
-rw-r--r-- 1 root root   1669 Apr 29  2014 ssh_config                  
-rw------- 1 root root    668 Jan 29  2015 ssh_host_dsa_key           
-rw-r--r-- 1 root root    607 Jan 29  2015 ssh_host_dsa_key.pub       
-rw-r--r-- 1 root root    399 Jan 29  2015 ssh_host_rsa_key.pub       
-rw-r--r-- 1 root root    302 Jan 10  2011 ssh_import_id               
-rw------- 1 root root    227 Jan 29  2015 ssh_host_ecdsa_key         
-rw-r--r-- 1 root root    179 Jan 29  2015 ssh_host_ecdsa_key.pub     
sysadmin@localhost:~$

También puede ser útil usar la opción -h para mostrar los tamaños de los archivos de una manera legible:

sysadmin@localhost:~$ ls -lSh /etc/ssh                                
total 160K                                                             
-rw-r--r-- 1 root root 123K Apr 29  2014 moduli                        
-rw-r--r-- 1 root root 2.5K Jan 29  2015 sshd_config                   
-rw------- 1 root root 1.7K Jan 29  2015 ssh_host_rsa_key              
-rw-r--r-- 1 root root 1.7K Apr 29  2014 ssh_config                   
-rw------- 1 root root  668 Jan 29  2015 ssh_host_dsa_key              
-rw-r--r-- 1 root root  607 Jan 29  2015 ssh_host_dsa_key.pub          
-rw-r--r-- 1 root root  399 Jan 29  2015 ssh_host_rsa_key.pub          
-rw-r--r-- 1 root root  302 Jan 10  2011 ssh_import_id           
-rw------- 1 root root  227 Jan 29  2015 ssh_host_ecdsa_key           
-rw-r--r-- 1 root root  179 Jan 29  2015 ssh_host_ecdsa_key.pub      
sysadmin@localhost:~$

También es posible ordenar los archivos según el momento en que se modificaron. Puedes hacer esto mediante la opción -t. La opción -t listará los archivos modificados más recientemente en primer lugar. Esta opción puede utilizarse sola, pero otra vez, es generalmente más útil cuando se combina con la opción -l

sysadmin@localhost:~$ ls -tl /etc/ssh                                 
total 160                                                             
-rw------- 1 root root    668 Jan 29  2015 ssh_host_dsa_key            
-rw-r--r-- 1 root root    607 Jan 29  2015 ssh_host_dsa_key.pub        
-rw------- 1 root root    227 Jan 29  2015 ssh_host_ecdsa_key          
-rw-r--r-- 1 root root    179 Jan 29  2015 ssh_host_ecdsa_key.pub     
-rw------- 1 root root   1675 Jan 29  2015 ssh_host_rsa_key            
-rw-r--r-- 1 root root    399 Jan 29  2015 ssh_host_rsa_key.pub       
-rw-r--r-- 1 root root   2489 Jan 29  2015 sshd_config                
-rw-r--r-- 1 root root 125749 Apr 29  2014 moduli                      
-rw-r--r-- 1 root root   1669 Apr 29  2014 ssh_config                  
-rw-r--r-- 1 root root    302 Jan 10  2011 ssh_import_id               
sysadmin@localhost:~$
 

 

Es importante recordar que la fecha de modificación de los directorios representa la última vez que un archivo se agrega o se elimina del directorio.

Si los archivos en un directorio se modificaron hace muchos días o meses, puede ser más difícil de decir exactamente cuándo fueron modificados, ya que para los archivos más antiguos sólamente se proporciona la fecha. Para una información más detallada de la hora de modificación puedes utilizar la opción --full time que visualiza la fecha y la hora completas (incluyendo horas, segundos, minutos…):

sysadmin@localhost:~$ ls -t --full-time /etc/ssh                       
total 160                                                             
-rw------- 1 root root    668 2015-01-29 03:17:33.000000000 +0000 ssh_host_dsa_key                                                            
-rw-r--r-- 1 root root    607 2015-01-29 03:17:33.000000000 +0000 ssh_host_dsa_key.pub                                                         
-rw------- 1 root root    227 2015-01-29 03:17:33.000000000 +0000 ssh_host_ecdsa_key                                                           
-rw-r--r-- 1 root root    179 2015-01-29 03:17:33.000000000 +0000 ssh_host_ecdsa_key.pub                                                      
-rw------- 1 root root   1675 2015-01-29 03:17:33.000000000 +0000 ssh_host_rsa_key                                                             
-rw-r--r-- 1 root root    399 2015-01-29 03:17:33.000000000 +0000 ssh_host_rsa_key.pub                                                         
-rw-r--r-- 1 root root   2489 2015-01-29 03:17:33.000000000 +0000 sshd_config   
-rw-r--r-- 1 root root 125749 2014-04-29 23:58:51.000000000 +0000 moduli-rw-r--r-- 1 root root   1669 2014-04-29 23:58:51.000000000 +0000 ssh_config    
-rw-r--r-- 1 root root    302 2011-01-10 18:48:29.000000000 +0000 ssh_import_id 
sysadmin@localhost:~$

La opción --full-time asumirá automáticamente la opción -l.

Es posible realizar una ordenación inversa con las opciones -S o -t mediante la opción -r. El siguiente comando ordena los archivos por tamaño, de menor a mayor:

sysadmin@localhost:~$ ls -lrS /etc/ssh                                 
total 160                                                              
-rw-r--r-- 1 root root    179 Jan 29  2015 ssh_host_ecdsa_key.pub      
-rw------- 1 root root    227 Jan 29  2015 ssh_host_ecdsa_key          
-rw-r--r-- 1 root root    302 Jan 10  2011 ssh_import_id               
-rw-r--r-- 1 root root    399 Jan 29  2015 ssh_host_rsa_key.pub        
-rw-r--r-- 1 root root    607 Jan 29  2015 ssh_host_dsa_key.pub        
-rw------- 1 root root    668 Jan 29  2015 ssh_host_dsa_key            
-rw-r--r-- 1 root root   1669 Apr 29  2014 ssh_config                  
-rw------- 1 root root   1675 Jan 29  2015 ssh_host_rsa_key            
-rw-r--r-- 1 root root   2489 Jan 29  2015 sshd_config                 
-rw-r--r-- 1 root root 125749 Apr 29  2014 moduli                      
sysadmin@localhost:~$

El siguiente comando listará los archivos por fecha de modificación, de la más antigua a la más reciente:

sysadmin@localhost:~$ ls -lrt /etc/ssh                                 
total 160                                                              
-rw-r--r-- 1 root root    302 Jan 10  2011 ssh_import_id               
-rw-r--r-- 1 root root   1669 Apr 29  2014 ssh_config                  
-rw-r--r-- 1 root root 125749 Apr 29  2014 moduli                      
-rw-r--r-- 1 root root   2489 Jan 29  2015 sshd_config                 
-rw-r--r-- 1 root root    399 Jan 29  2015 ssh_host_rsa_key.pub        
-rw------- 1 root root   1675 Jan 29  2015 ssh_host_rsa_key            
-rw-r--r-- 1 root root    179 Jan 29  2015 ssh_host_ecdsa_key.pub      
-rw------- 1 root root    227 Jan 29  2015 ssh_host_ecdsa_key          
-rw-r--r-- 1 root root    607 Jan 29  2015 ssh_host_dsa_key.pub        
-rw------- 1 root root    668 Jan 29  2015 ssh_host_dsa_key            
sysadmin@localhost:~$

Listado con Globs

En un capítulo anterior, vimos el uso de los globs para los archivos para buscar coincidencias de los nombres de archivo utilizando los caracteres comodín. Por ejemplo, hemos visto que puedes listar todos los archivos en el directorio /etc que comienzan con la letra e utilizando el siguiente comando:

sysadmin@localhost:~$ echo /etc/e*                                    
/etc/encript.cfg /etc/environment /etc/ethers /etc/event.d /etc/exports
sysadmin@localhost:~$

Ahora que sabes que el comando ls se utiliza normalmente para listar los archivos en un directorio, el uso del comando echo puede parecer una elección extraña. Sin embargo, hay algo sobre el comando ls que pudo haber causado confusión mientras hablamos sobre los globs. Esta «función» también puede causar problemas cuando intentas listar los archivos utilizando los patrones glob.

Ten en cuenta que es el shell, no los comandos echo o ls, el que expande el patrón glob a los nombres de archivo correspondientes. En otras palabras, cuando introduces el comando echo /etc/e*, lo que el shell hizo antes de ejecutar el comando echo fue reemplazar el e* por todos los archivos y directorios dentro del directorio /etc que coinciden con el patrón.

Por lo tanto, si ejecutaras el comando ls /etc/e*, lo que el shell realmente haría, sería lo siguiente:

ls /etc/encript.cfg /etc/environment /etc/ethers /etc/event.d /etc/exports

Cuando el comando ls ve varios argumentos, realiza una operación de listado en cada elemento por separado. En otras palabras, el comando ls /etc/encript.cfg /etc/environment es esencialmente igual a ls /etc/encript.cfg; ls /etc/environment.

Ahora considera lo que sucede cuando se ejecuta el comando ls en un archivo, tal como encript.cfg:

sysadmin@localhost:~$ ls /etc/enscript.cfg                             
/etc/enscript.cfg        
sysadmin@localhost:~$

Como puedes ver, ejecutando el comando ls en un solo archivo se imprime el nombre del archivo. Generalmente esto es útil si quieres ver los detalles acerca de un archivo mediante la opción -l del comando ls:

sysadmin@localhost:~$ ls -l /etc/enscript.cfg                         
-r--r--r--. 1 root root 4843 Nov 11 2010 /etc/enscript.cfg      
sysadmin@localhost:~$

Sin embargo, ¿Qué ocurre si el comando ls recibe un nombre de directorio como un argumento? En este caso, la salida del comando es diferente a que si el argumento es un nombre de archivo:

sysadmin@localhost:~$ ls /etc/event.d                                    
ck-log-system-restart  ck-log-system-start  ck-log-system-stop            
sysadmin@localhost:~$

Si proporcionas un nombre de directorio como argumento del comando ls, el comando mostrará el contenido del directorio (los nombres de los archivos en el directorio), y no sólo proporcionará el nombre del directorio. Los nombres de los archivos, que se ven en el ejemplo anterior, son los nombres de los archivos en el directorio /etc/event.d.

¿Por qué ésto es un problema al utilizar los globs? Considera el siguiente resultado:

sysadmin@localhost:~$ ls /etc/e*                                          
/etc/encript.cfg /etc/environment /etc/ethers /etc/event.d /etc/exports       
/etc/event.d:
ck-log-system-restart  ck-log-system-start  ck-log-system-stop            
sysadmin@localhost:~$

Como puedes ver, cuando el comando ls ve un nombre de archivo como argumento, sólo muestra el nombre del archivo. Sin embargo, para cualquier directorio, mostrará el contenido del directorio, y no sólo el nombre del directorio.

Esto se vuelve aún más confuso en una situación como la siguiente:

sysadmin@localhost:~$ ls /etc/ev*                                        
ck-log-system-restart  ck-log-system-start  ck-log-system-stop            
sysadmin@localhost:~$

En el ejemplo anterior, parece que el comando ls es simplemente incorrecto. Pero lo que realmente sucedió es que lo único que coincide con el glob etc/ev * es el directorio /etc/event.d. Por lo tanto, el comando ls muestra sólo los archivos en ese directorio.

Hay una solución simple a este problema: al utilizar los argumentos glob con el comando ls, utiliza siempre la opción -d. Cuando utilizas la opción -d, el comando ls no muestra el contenido de un directorio, sino más bien el nombre del directorio:

sysadmin@localhost:~$ ls -d /etc/e*                                      
/etc/encript.cfg /etc/environment /etc/ethers /etc/event.d /etc/exports   
sysadmin@localhost:~$
 

 

Es importante recordar que la fecha de modificación de los directorios representa la última vez que un archivo se agrega o se elimina del directorio.

Si los archivos en un directorio se modificaron hace muchos días o meses, puede ser más difícil de decir exactamente cuándo fueron modificados, ya que para los archivos más antiguos sólamente se proporciona la fecha. Para una información más detallada de la hora de modificación puedes utilizar la opción --full time que visualiza la fecha y la hora completas (incluyendo horas, segundos, minutos…):

sysadmin@localhost:~$ ls -t --full-time /etc/ssh                       
total 160                                                             
-rw------- 1 root root    668 2015-01-29 03:17:33.000000000 +0000 ssh_host_dsa_key                                                            
-rw-r--r-- 1 root root    607 2015-01-29 03:17:33.000000000 +0000 ssh_host_dsa_key.pub                                                         
-rw------- 1 root root    227 2015-01-29 03:17:33.000000000 +0000 ssh_host_ecdsa_key                                                           
-rw-r--r-- 1 root root    179 2015-01-29 03:17:33.000000000 +0000 ssh_host_ecdsa_key.pub                                                      
-rw------- 1 root root   1675 2015-01-29 03:17:33.000000000 +0000 ssh_host_rsa_key                                                             
-rw-r--r-- 1 root root    399 2015-01-29 03:17:33.000000000 +0000 ssh_host_rsa_key.pub                                                         
-rw-r--r-- 1 root root   2489 2015-01-29 03:17:33.000000000 +0000 sshd_config   
-rw-r--r-- 1 root root 125749 2014-04-29 23:58:51.000000000 +0000 moduli-rw-r--r-- 1 root root   1669 2014-04-29 23:58:51.000000000 +0000 ssh_config    
-rw-r--r-- 1 root root    302 2011-01-10 18:48:29.000000000 +0000 ssh_import_id 
sysadmin@localhost:~$

La opción --full-time asumirá automáticamente la opción -l.

Es posible realizar una ordenación inversa con las opciones -S o -t mediante la opción -r. El siguiente comando ordena los archivos por tamaño, de menor a mayor:

sysadmin@localhost:~$ ls -lrS /etc/ssh                                 
total 160                                                              
-rw-r--r-- 1 root root    179 Jan 29  2015 ssh_host_ecdsa_key.pub      
-rw------- 1 root root    227 Jan 29  2015 ssh_host_ecdsa_key          
-rw-r--r-- 1 root root    302 Jan 10  2011 ssh_import_id               
-rw-r--r-- 1 root root    399 Jan 29  2015 ssh_host_rsa_key.pub        
-rw-r--r-- 1 root root    607 Jan 29  2015 ssh_host_dsa_key.pub        
-rw------- 1 root root    668 Jan 29  2015 ssh_host_dsa_key            
-rw-r--r-- 1 root root   1669 Apr 29  2014 ssh_config                  
-rw------- 1 root root   1675 Jan 29  2015 ssh_host_rsa_key            
-rw-r--r-- 1 root root   2489 Jan 29  2015 sshd_config                 
-rw-r--r-- 1 root root 125749 Apr 29  2014 moduli                      
sysadmin@localhost:~$

El siguiente comando listará los archivos por fecha de modificación, de la más antigua a la más reciente:

sysadmin@localhost:~$ ls -lrt /etc/ssh                                 
total 160                                                              
-rw-r--r-- 1 root root    302 Jan 10  2011 ssh_import_id               
-rw-r--r-- 1 root root   1669 Apr 29  2014 ssh_config                  
-rw-r--r-- 1 root root 125749 Apr 29  2014 moduli                      
-rw-r--r-- 1 root root   2489 Jan 29  2015 sshd_config                 
-rw-r--r-- 1 root root    399 Jan 29  2015 ssh_host_rsa_key.pub        
-rw------- 1 root root   1675 Jan 29  2015 ssh_host_rsa_key            
-rw-r--r-- 1 root root    179 Jan 29  2015 ssh_host_ecdsa_key.pub      
-rw------- 1 root root    227 Jan 29  2015 ssh_host_ecdsa_key          
-rw-r--r-- 1 root root    607 Jan 29  2015 ssh_host_dsa_key.pub        
-rw------- 1 root root    668 Jan 29  2015 ssh_host_dsa_key            
sysadmin@localhost:~$

Evitar Sobrescribir los Datos

El comando cp puede ser destructivo para los datos si el archivo de destino ya existe. En el caso donde el archivo de destino existe, el comando cp sobreescribe el contenido del archivo existente con el contenido del archivo fuente. Para ilustrar este problema, primero se crea un nuevo archivo en el directorio home sysadmin copiando un archivo existente:

sysadmin@localhost:~$ cp /etc/skel/.bash_logout ~/example.txt 
sysadmin@localhost:~$

Visualiza la salida del comando ls para ver el archivo y visualiza el contenido del archivo utilizando el comando more:

sysadmin@localhost:~$ cp /etc/skel/.bash_logout ~/example.txt
sysadmin@localhost:~$ ls -l example.txt
-rw-rw-r--. 1 sysadmin sysadmin 18 Sep 21 15:56 example.txt
sysadmin@localhost:~$ more example.txt
# ~/.bash_logout: executed by bash(1) when login shell exits.

sysadmin@localhost:~$ cp -i /etc/hosts ~/example.txt
cp: overwrite `/home/sysadmin/example.txt'? n
sysadmin@localhost:~$ ls -l example.txt
-rw-rw-r--. 1 sysadmin sysadmin 18 Sep 21 15:56 example.txt
sysadmin@localhost:~$ more example.txt
# ~/.bash_logout: executed by bash(1) when login shell exits.

sysadmin@localhost:~$

En el siguiente ejemplo verás que el comando cp destruye el contenido original del archivo ejemplo.txt. Observa que una vez finalizado el comando cp, el tamaño del archivo es diferente (158 bytes en lugar de 18) del original y los contenido también son diferentes:

sysadmin@localhost:~$ cp /etc/hosts ~/example.txt
sysadmin@localhost:~$ ls -l example.txt
-rw-rw-r--. 1 sysadmin sysadmin 158 Sep 21 14:11 example.txt
sysadmin@localhost:~$ cat example.txt
127.0.0.1  localhost localhost.localdomain localhost4 localhost4.localdomain4
::1        localhost localhost.localdomain localhost6 localhost6.localdomain6
sysadmin@localhost:~$

Hay dos opciones que pueden utilizarse para asegurarnos contra sobreescrituras accidentales de los archivos. Con la opción -i (interactivo), el comando cp emitirá un prompt antes de sobrescribir un archivo. En el siguiente ejemplo demostrará esta opción, primero restaurando el contenido del archivo original:

sysadmin@localhost:~$ cp /etc/skel/.bash_logout ~/example.txt          
sysadmin@localhost:~$ ls -l example.txt                                
-rw-r--r-- 1 sysadmin sysadmin 18 Sep 21 15:56 example.txt           
sysadmin@localhost:~$ more example.txt                                 
# ~/.bash_logout: executed by bash(1) when login shell exits.         

sysadmin@localhost:~$ cp -i /etc/hosts ~/example.txt                   
cp: overwrite `/home/sysadmin/example.txt'? n                          
sysadmin@localhost:~$ ls -l example.txt                                
-rw-r--r-- 1 sysadmin sysadmin 18 Sep  21 15:56 example.txt            
sysadmin@localhost:~$ more example.txt                                
# ~/.bash_logout: executed by bash(1) when login shell exits.          

sysadmin@localhost:~$

Observa que puesto que el valor de n (no) se dió al emitir un prompt de sobrescritura del archivo, no se hicieron cambios en el archivo. Si se da un valor de y (sí), entonces resultará en un proceso de copiado.

La opción -i requiere respuesta y o n para cada copia que podría sobrescribir el contenido de un archivo existente. Esto puede ser tedioso cuando se sobrescribe un grupo, como se muestra en el siguiente ejemplo:

sysadmin@localhost:~$ cp -i /etc/skel/.* ~                             
cp: omitting directory `/etc/skel/.'                                   
cp: omitting directory `/etc/skel/..'                                  
cp: overwrite `/home/sysadmin/.bash_logout'? n                         
cp: overwrite `/home/sysadmin/.bashrc'? n                              
cp: overwrite `/home/sysadmin/.profile'? n                            
cp: overwrite `/home/sysadmin/.selected_editor'? n                     
sysadmin@localhost:~$

Como puedes ver en el ejemplo anterior, el comando cp intentó sobrescribir los cuatro archivos existentes, obligando al usuario a responder a tres prompts. Si esta situación ocurriera para 100 archivos, puede resultar muy molesto rápidamente.

Si quieres contestar automáticamente n para cada prompt, utiliza la opción -n. En esencia, significa «sin sobreescribir».

 

 

Es importante recordar que la fecha de modificación de los directorios representa la última vez que un archivo se agrega o se elimina del directorio.

Si los archivos en un directorio se modificaron hace muchos días o meses, puede ser más difícil de decir exactamente cuándo fueron modificados, ya que para los archivos más antiguos sólamente se proporciona la fecha. Para una información más detallada de la hora de modificación puedes utilizar la opción --full time que visualiza la fecha y la hora completas (incluyendo horas, segundos, minutos…):

sysadmin@localhost:~$ ls -t --full-time /etc/ssh                       
total 160                                                             
-rw------- 1 root root    668 2015-01-29 03:17:33.000000000 +0000 ssh_host_dsa_key                                                            
-rw-r--r-- 1 root root    607 2015-01-29 03:17:33.000000000 +0000 ssh_host_dsa_key.pub                                                         
-rw------- 1 root root    227 2015-01-29 03:17:33.000000000 +0000 ssh_host_ecdsa_key                                                           
-rw-r--r-- 1 root root    179 2015-01-29 03:17:33.000000000 +0000 ssh_host_ecdsa_key.pub                                                      
-rw------- 1 root root   1675 2015-01-29 03:17:33.000000000 +0000 ssh_host_rsa_key                                                             
-rw-r--r-- 1 root root    399 2015-01-29 03:17:33.000000000 +0000 ssh_host_rsa_key.pub                                                         
-rw-r--r-- 1 root root   2489 2015-01-29 03:17:33.000000000 +0000 sshd_config   
-rw-r--r-- 1 root root 125749 2014-04-29 23:58:51.000000000 +0000 moduli-rw-r--r-- 1 root root   1669 2014-04-29 23:58:51.000000000 +0000 ssh_config    
-rw-r--r-- 1 root root    302 2011-01-10 18:48:29.000000000 +0000 ssh_import_id 
sysadmin@localhost:~$

La opción --full-time asumirá automáticamente la opción -l.

Es posible realizar una ordenación inversa con las opciones -S o -t mediante la opción -r. El siguiente comando ordena los archivos por tamaño, de menor a mayor:

sysadmin@localhost:~$ ls -lrS /etc/ssh                                 
total 160                                                              
-rw-r--r-- 1 root root    179 Jan 29  2015 ssh_host_ecdsa_key.pub      
-rw------- 1 root root    227 Jan 29  2015 ssh_host_ecdsa_key          
-rw-r--r-- 1 root root    302 Jan 10  2011 ssh_import_id               
-rw-r--r-- 1 root root    399 Jan 29  2015 ssh_host_rsa_key.pub        
-rw-r--r-- 1 root root    607 Jan 29  2015 ssh_host_dsa_key.pub        
-rw------- 1 root root    668 Jan 29  2015 ssh_host_dsa_key            
-rw-r--r-- 1 root root   1669 Apr 29  2014 ssh_config                  
-rw------- 1 root root   1675 Jan 29  2015 ssh_host_rsa_key            
-rw-r--r-- 1 root root   2489 Jan 29  2015 sshd_config                 
-rw-r--r-- 1 root root 125749 Apr 29  2014 moduli                      
sysadmin@localhost:~$

El siguiente comando listará los archivos por fecha de modificación, de la más antigua a la más reciente:

sysadmin@localhost:~$ ls -lrt /etc/ssh                                 
total 160                                                              
-rw-r--r-- 1 root root    302 Jan 10  2011 ssh_import_id               
-rw-r--r-- 1 root root   1669 Apr 29  2014 ssh_config                  
-rw-r--r-- 1 root root 125749 Apr 29  2014 moduli                      
-rw-r--r-- 1 root root   2489 Jan 29  2015 sshd_config                 
-rw-r--r-- 1 root root    399 Jan 29  2015 ssh_host_rsa_key.pub        
-rw------- 1 root root   1675 Jan 29  2015 ssh_host_rsa_key            
-rw-r--r-- 1 root root    179 Jan 29  2015 ssh_host_ecdsa_key.pub      
-rw------- 1 root root    227 Jan 29  2015 ssh_host_ecdsa_key          
-rw-r--r-- 1 root root    607 Jan 29  2015 ssh_host_dsa_key.pub        
-rw------- 1 root root    668 Jan 29  2015 ssh_host_dsa_key            
sysadmin@localhost:~$

Copiar los Archivos

El comando cp se utiliza para copiar los archivos. Requiere especificar un origen y un destino. La estructura del comando es la siguiente:

cp [fuente] [destino]

La fuente («source» en inglés) es el archivo que quieres copiar. El destino («destination» en inglés) es la ubicación en donde quieres poner la copia. Cuando el comando es exitoso, el comando cp no tendrá ninguna salida (ninguna noticia es buena noticia). El siguiente comando copiará el archivo /etc/hosts a tu directorio home:

sysadmin@localhost:~$ cp /etc/hosts ~                                     
sysadmin@localhost:~$ ls                                                  
Desktop    Downloads  Pictures  Templates  hosts                          
Documents  Music      Public    Videos                                    
sysadmin@localhost:~$
Recuerda: El carácter ~ representa el directorio home.
 

El Modo Verbose

La opción -v hará que el comando cp produzca la salida en caso de ser exitoso. La opción -v se refiere al comando verbose:

 
sysadmin@localhost:~$ cp -v /etc/hosts ~                              
`/etc/hosts' -> `/home/sysadmin/hosts'                                 
sysadmin@localhost:~$

Cuando el destino es un directorio, el nuevo archivo resultante tendrá el mismo nombre que el archivo original. Si quieres que el nuevo archivo tenga un nombre diferente, debes proporcionar el nuevo nombre como parte del destino:

sysadmin@localhost:~$ cp /etc/hosts ~/hosts.copy                      
sysadmin@localhost:~$ ls                                               
Desktop    Downloads  Pictures  Templates  hosts                       
Documents  Music      Public    Videos     hosts.copy                  
sysadmin@localhost:~$