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:
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
: /home
. Bajo 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 s
erí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:
.
), 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:
Tipo | Descripció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 link | Un 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=auto
. En 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:~$
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:~$
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».
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:~$
~
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:~$