Note

The Funtoo Linux project has transitioned to "Hobby Mode" and this wiki is now read-only.

Difference between revisions of "User talk:Arlesy"

From Funtoo
Jump to navigation Jump to search
Line 343: Line 343:


== Creando Enlaces y Removiendo Archivos ==
== Creando Enlaces y Removiendo Archivos ==
=== Enlaces duros ===
Hemos mencionado el término "enlace" cuando nos referimos a la relación entre las entradas de directorio (los "nombres" que escribimos) y los inodos (los números de índice en el sistema de archivos subyacente que normalmente podemos ignorar). En realidad hay dos tipos de enlaces disponibles en Linux. El tipo que hemos discutido hasta ahora se llama enlaces duros. Un inodo dado puede tener cualquier número de enlaces duros, y el inodo persistirá en el sistema de archivos hasta que todos los enlaces duros desaparezcan. Cuando el último vínculo duro desaparezca y ningún programa mantenga abierto el archivo, Linux eliminará el archivo automáticamente. Se pueden crear nuevos vínculos duros mediante el comando ln:
<pre>
$ cd /tmp
$ touch firstlink
$ ln firstlink secondlink
$ ls -i firstlink secondlink
  15782 firstlink    15782 secondlink
</pre>
Como puede ver, los enlaces duros funcionan en el nivel de inodo para apuntar a un archivo en particular. En sistemas Linux, los enlaces duros tienen varias limitaciones. Por un lado, sólo puede hacer enlaces duros a los archivos, no a los directorios. Está bien; aunque . y .. son enlaces duros a los directorios creados por el sistema, usted (incluso como el usuario "root") no están autorizados a crearlos por cuenta propia. La segunda limitación de los enlaces duros es que no pueden abarcar los sistemas de archivos; que sería el caso si los sistemas de archivos se encuentran en particiones de disco independientes. Esto significa que no puede crear un enlace desde /usr/bin/bash a /bin/bash si sus directorios / y /usr existen en particiones de disco separadas.
=== Enlaces simbólicos ===
En la práctica, los enlaces simbólicos (o symlinks) se utilizan con más frecuencia que los enlaces duros. Los enlaces simbólicos son un tipo de archivo especial donde el vínculo se refiere a otro archivo por nombre, en lugar de directamente al inodo. Los enlaces simbólicos no impiden que se elimine un archivo; Si el archivo de destino desaparece, entonces el enlace simbólico sólo será inutilizable o roto.
Se puede crear un enlace simbólico pasando la opción -s a ln.
<pre>
$ ln -s secondlink thirdlink
$ ls -l firstlink secondlink thirdlink
-rw-rw-r--    2 agriffis agriffis        0 Dec 31 19:08 firstlink
-rw-rw-r--    2 agriffis agriffis        0 Dec 31 19:08 secondlink
lrwxrwxrwx    1 agriffis agriffis      10 Dec 31 19:39 thirdlink -> secondlink
</pre>
Los enlaces simbólicos se pueden distinguir en ls -l salida de archivos normales de tres maneras. En primer lugar, observe que la primera columna contiene un carácter l para indicar el enlace simbólico. En segundo lugar, el tamaño del enlace simbólico es el número de caracteres en el destino (segundo enlace, en este caso). En tercer lugar, la última columna de la salida muestra el nombre de archivo de destino precedido por una flecha ->.
=== Symlinks en profundidad ===
Los enlaces simbólicos son generalmente más flexibles que los enlaces duros. Puede crear un vínculo simbólico con cualquier tipo de objeto del sistema de archivos, incluidos los directorios. Y debido a que la implementación de enlaces simbólicos se basa en rutas (no en inodos), está perfectamente bien crear un enlace simbólico que apunte a un objeto en otro sistema de archivos físico; es decir, una partición de disco diferente. Sin embargo, este hecho también puede hacer que los enlaces simbólicos sean difíciles de entender.
Considere una situación donde queremos crear un enlace en /tmp que apunte a /usr/local/bin. Deberíamos escribir esto:
<pre>
$ ln -s /usr/local/bin bin1
$ ls -l bin1
lrwxrwxrwx    1 root    root          14 Jan  1 15:42 bin1 -> /usr/local/bin
</pre>
O alternativamente:
<pre>
$ ln -s ../usr/local/bin bin2
$ ls -l bin2
lrwxrwxrwx    1 root    root          16 Jan  1 15:43 bin2 -> ../usr/local/bin
</pre>
Como puede ver, ambos enlaces simbólicos apuntan al mismo directorio. Sin embargo, si nuestro segundo enlace simbólico es movido a otro directorio, se "romperá" debido a la ruta relativa:
<pre>
$ ls -l bin2
lrwxrwxrwx    1 root    root          16 Jan  1 15:43 bin2 -> ../usr/local/bin
$ mkdir mynewdir
$ mv bin2 mynewdir
$ cd mynewdir
$ cd bin2
bash: cd: bin2: No such file or directory
</pre>
Debido a que el directorio /tmp/usr/local/bin no existe, ya no podemos cambiar los directorios en bin2; en otras palabras, bin2 está ahora roto.
Por esta razón, a veces es una buena idea evitar crear enlaces simbólicos con la información de ruta relativa. Sin embargo, hay muchos casos donde los enlaces simbólicos relativos son muy útiles. Considere un ejemplo en el que desea crear un nombre alternativo para un programa en /usr/bin:
<pre>
# ls -l /usr/bin/keychain
-rwxr-xr-x    1 root    root        10150 Dec 12 20:09 /usr/bin/keychain
</pre>
Como usuario root, puede crear un nombre alternativo para "llavero", como "kc". En este ejemplo, tenemos acceso de root, como lo demuestra nuestro indicador bash cambiando a "#". Necesitamos acceso root porque los usuarios normales no pueden crear archivos en /usr/bin. Como root, podríamos crear un nombre alternativo para keychain de la siguiente manera:
<pre>
# cd /usr/bin
# ln -s /usr/bin/keychain kc
# ls -l keychain
-rwxr-xr-x    1 root    root        10150 Dec 12 20:09 /usr/bin/keychain
# ls -l kc     
lrwxrwxrwx    1 root    root          17 Mar 27 17:44 kc -> /usr/bin/keychain
</pre>
En este ejemplo, creamos un enlace simbólico llamado kc que apunta al archivo /usr/bin/keychain.
Si bien esta solución funcionará, creará problemas si decidimos que queremos mover ambos archivos, /usr/bin/keychain y /usr/bin/kc a /usr/local/bin:
<pre>
# cd /usr/bin
# ln -s keychain kc
# ls -l kc
lrwxrwxrwx    1 root    root            8 Jan  5 12:40 kc -> keychain
# mv keychain kc /usr/local/bin
# ls -l /usr/local/bin/keychain
-rwxr-xr-x    1 root    root        10150 Dec 12 20:09 /usr/local/bin/keychain
# ls -l /usr/local/bin/kc
lrwxrwxrwx    1 root    root          17 Mar 27 17:44 kc -> keychain
</pre>
Debido a que usamos un camino absoluto en nuestro enlace simbólico, nuestro enlace simbólico kc sigue apuntando a /usr/bin/ keychain, que ya no existe desde que movimos /usr/bin/keychain a /usr/local/bin.
Eso significa que kc es ahora un enlace simbólico roto. Tanto las rutas relativas como las absolutas en los enlaces simbólicos tienen sus méritos, y debe usar un tipo de ruta que sea apropiado para su aplicación particular. A menudo, un camino relativo o absoluto funcionará bien. El ejemplo siguiente habría funcionado incluso después de mover ambos archivos:
<pre>
# cd /usr/bin
# ln -s keychain kc
# ls -l kc
lrwxrwxrwx    1 root    root            8 Jan  5 12:40 kc -> keychain
# mv keychain kc /usr/local/bin
# ls -l /usr/local/bin/keychain
-rwxr-xr-x    1 root    root        10150 Dec 12 20:09 /usr/local/bin/keychain
# ls -l /usr/local/bin/kc
lrwxrwxrwx    1 root    root          17 Mar 27 17:44 kc -> keychain
</pre>
Ahora, podemos ejecutar el programa keychain escribiendo /usr/local/bin/kc. /usr/local/bin/kc apunta al llavero del programa en el mismo directorio que kc.

Revision as of 17:07, August 12, 2017

Arlesy (talk) 09:59, August 12, 2017 (MDT) Inicio de traducción del curso Fundamentos de Linux, Parte 1

Antes de empezar

Acerca de este tutorial

Bienvenido a "Fundamentos de Linux," el primero de sus tutoriales hecho para prepararlo para el examen 101 de Linux Professional Institute's. En este tutorial, te presentamos a bash (el shell Linux estándar), te mostraremos cómo aprovechar al máximo los comandos estándar de Linux, como ls, cp y mv, explicar inodes, enlaces duros y simbólicos, y mucho más. Al final de este tutorial, tendrá una base sólida en los fundamentos de Linux e incluso estará listo para comenzar a aprender algunas tareas básicas de administración de sistemas Linux. Al final de esta serie de tutoriales (ocho en total), tendrá el conocimiento que necesita para convertirse en un Administrador de Sistemas Linux y estará listo para obtener una certificación LPIC Level 1 del Linux Professional Institute si así lo desea.

Este tutorial en particular (Parte 1) es ideal para aquellos que son nuevos en Linux, o aquellos que quieren revisar o mejorar su comprensión de conceptos fundamentales de Linux como copiar y mover archivos, creando vínculos simbólicos y vínculos duros, y usando comandos de procesamiento de texto estándar de Linux junto con tuberías y redirección. En el camino, vamos a compartir un montón de consejos y trucos para mantener el tutorial sustancioso y práctico, incluso para aquellos con una buena cantidad de experiencia previa de Linux. Para los principiantes, gran parte de este material será nuevo, pero los usuarios más experimentados de Linux pueden encontrar este tutorial como una gran forma de redondear sus habilidades fundamentales de Linux.

Para aquellos que han tomado la versión 1 de este tutorial por razones distintas a la preparación para el examen LPI, es probable que no necesite tomar esta.

Introducción a bash

El shell

Si has utilizado un sistema Linux, sabes que cuando inicias sesión, te recibe un mensaje que se parece a esto:

user $

El indicador particular que ve puede verse muy diferente. Puede contener el nombre de host del sistema, el nombre del directorio de trabajo actual o ambos. Pero independientemente de lo que su mensaje muestre, hay una cosa cierta. El programa que imprimió ese mensaje se denomina "shell", y es muy probable que su shell particular sea un programa llamado bash.

¿Está ejecutando bash?

Puede comprobar si está ejecutando bash escribiendo:

user $  echo $ SHELL 
/bin/bash

Si la línea anterior le dio un error o no respondió de manera similar a nuestro ejemplo, puede estar ejecutando un shell que no sea bash. En ese caso, la mayor parte de este tutorial todavía debe aplicarse, pero sería ventajoso que usted cambie a bash para una buena preparación del examen 101.

Acerca de bash

Bash, un acrónimo de "Bourne-again shell", es el shell por defecto en la mayoría de los sistemas Linux. El trabajo de la shell es obedecer sus comandos para que pueda interactuar con su sistema Linux. Cuando haya terminado de introducir los comandos, puede indicar al shell que salga o cierre la sesión, momento en el que se le devolverá a un indicador de inicio de sesión.

Por cierto, también puedes cerrar la sesión pulsando control-D en el prompt de bash.

Usando "cd"

Como usted probablemente ha encontrado, mirar la salida de bash no es la cosa más emocionante en el mundo. Por lo tanto, vamos a empezar a usar bash para navegar por nuestro sistema de archivos. En el indicador, escriba lo siguiente (sin el $):

user $ cd /

Acabamos de decirle a bash que quieres trabajar en /, también conocido como el directorio raíz; todos los directorios en el sistema forman un árbol, y / se considera la parte superior de este árbol, o la raíz. cd establece el directorio en el que está trabajando actualmente, también conocido como el "directorio de trabajo actual".

Paths(Rutas)

Para ver el directorio de trabajo actual de bash, puede escribir:

user $ pwd
user $ /

En el ejemplo anterior, el argumento / a cd se llama ruta. Le dice a cd dónde queremos ir. En particular, el argumento / es una ruta absoluta, lo que significa que especifica una ubicación relativa a la raíz del árbol del sistema de archivos. Rutas absolutas

Aquí hay otras rutas absolutas:

/dev
/usr
/usr/bin
/usr/local/bin

Como puede ver, la única cosa que todos los rutas absolutas tienen en común es que comienzan con /. Con una ruta de acceso a /usr/local/bin, estamos diciendo a cd que entre en el directorio /, a continuación al directorio usr, luego local y bin. Las rutas absolutas se evalúan siempre comenzando en / primero.

Rutas relativas

El otro tipo de ruta se llama una ruta relativa. Bash, cd y otros comandos siempre interpretan estas rutas en relación con el directorio actual. Las rutas relativas nunca comienzan con un /. Por lo tanto, si estamos en /usr:

user $ cd /usr

Entonces, podemos usar una ruta relativa para cambiar al directorio /usr/local/bin:

user $ cd local/bin
user $ pwd
/usr/local/bin

Utilizando ..

Las rutas relativas también pueden contener uno o más directorios. El directorio .. es un directorio especial que apunta al directorio padre. Así, continuando desde el ejemplo anterior:

$ pwd
/usr/local/bin
$ cd ..
$ pwd
/usr/local

Como puede ver, nuestro directorio actual es ahora /usr/local. Pudimos ir "al revés" un directorio, relativo al directorio actual en el que estábamos.

Además, también podemos añadir .. a una ruta relativa existente, lo que nos permite entrar en un directorio que está junto a uno en el que ya estamos, por ejemplo:

$ pwd
/usr/local
$ cd ../share
$ pwd
/usr/share

Ejemplos de ruta relativa

Las rutas relativas pueden ser bastante complejas. Aquí hay algunos ejemplos, todos sin el directorio de destino resultante mostrado. Trate de averiguar dónde terminará después de escribir estos comandos:

$ cd /bin
$ cd ../usr/share/zoneinfo


$ cd /usr/X11R6/bin
$ cd ../lib/X11


$ cd /usr/bin
$ cd ../bin/../bin

Ahora, probarlos y ver si los tienes bien :)

Entendiendo el "."

Antes de terminar nuestra cobertura de cd, hay algunas cosas más que necesito mencionar. En primer lugar, hay otro directorio especial llamado., Que significa "el directorio actual". Aunque este directorio no se utiliza con el comando cd, a menudo se utiliza para ejecutar algún programa en el directorio actual, de la siguiente manera:

$ ./myprog

En el ejemplo anterior, se ejecutará el ejecutable myprog residente en el directorio de trabajo actual.

cd y el directorio de inicio

Si queremos cambiar a nuestro directorio personal, podríamos escribir:

$ cd

Sin argumentos, cd cambiará a su directorio de inicio, que es /root para el superusuario y normalmente /home/nombre de usuario para un usuario normal. Pero ¿qué pasa si queremos especificar un archivo en nuestro directorio personal? Tal vez queramos pasar un argumento de archivo al comando myprog. Si el archivo reside en nuestro directorio personal, podemos escribir:

$ ./myprog /home/drobbins/myfile.txt

Sin embargo, usar un camino absoluto como ese no siempre es conveniente. Afortunadamente, podemos usar el carácter ~ (tilde) para hacer lo mismo:

$ ./myprog ~/myfile.txt

Directorios de inicio de otros usuarios

Bash expandirá un solo ~ para apuntar a su directorio personal, pero también puede usarlo para apuntar a los directorios de inicio de otros usuarios. Por ejemplo, si queremos hacer referencia a un archivo llamado fredsfile.txt en el directorio personal de Fred, podríamos escribir:

$ ./myprog ~fred/fredsfile.txt

Usando comandos de Linux

Introduciendo ls

Ahora, echaremos un vistazo al comando ls. Es muy probable que ya esté familiarizado con ls y sabe que al escribirlo por sí mismo se lista el contenido del directorio de trabajo actual:

$ cd /usr
$ ls
X11R6      doc         i686-pc-linux-gnu  lib      man          sbin   ssl
bin        gentoo-x86  include            libexec  portage      share  tmp
distfiles  i686-linux  info               local    portage.old  src

Al especificar la opción -a, puede ver todos los archivos de un directorio, incluidos los archivos ocultos: los que comienzan con (.). Como se puede ver en el ejemplo siguiente, ls -a revela los archivo . y .. directorio especial de enlaces:

$ ls -a
.      bin        gentoo-x86         include  libexec  portage      share  tmp
..     distfiles  i686-linux         info     local    portage.old  src
X11R6  doc        i686-pc-linux-gnu  lib      man      sbin         ssl

Listados largos del directorio

También puede especificar uno o más archivos o directorios en la línea de comandos de ls. Si especifica un archivo, ls mostrará ese archivo solamente. Si especifica un directorio, ls mostrará el contenido del directorio. La opción -l resulta muy útil cuando necesita ver los permisos, la propiedad, la hora de modificación y la información de tamaño en su lista de directorios.

En el ejemplo siguiente, usamos la opción -l para mostrar una lista completa de mi directorio /usr.

$ ls -l /usr
drwxr-xr-x    7 root     root          168 Nov 24 14:02 X11R6
drwxr-xr-x    2 root     root        14576 Dec 27 08:56 bin
drwxr-xr-x    2 root     root         8856 Dec 26 12:47 distfiles
lrwxrwxrwx    1 root     root            9 Dec 22 20:57 doc -> share/doc
drwxr-xr-x   62 root     root         1856 Dec 27 15:54 gentoo-x86
drwxr-xr-x    4 root     root          152 Dec 12 23:10 i686-linux
drwxr-xr-x    4 root     root           96 Nov 24 13:17 i686-pc-linux-gnu
drwxr-xr-x   54 root     root         5992 Dec 24 22:30 include
lrwxrwxrwx    1 root     root           10 Dec 22 20:57 info -> share/info
drwxr-xr-x   28 root     root        13552 Dec 26 00:31 lib
drwxr-xr-x    3 root     root           72 Nov 25 00:34 libexec
drwxr-xr-x    8 root     root          240 Dec 22 20:57 local
lrwxrwxrwx    1 root     root            9 Dec 22 20:57 man -> share/man
lrwxrwxrwx    1 root     root           11 Dec  8 07:59 portage -> gentoo-x86/
drwxr-xr-x   60 root     root         1864 Dec  8 07:55 portage.old
drwxr-xr-x    3 root     root         3096 Dec 22 20:57 sbin
drwxr-xr-x   46 root     root         1144 Dec 24 15:32 share
drwxr-xr-x    8 root     root          328 Dec 26 00:07 src
drwxr-xr-x    6 root     root          176 Nov 24 14:25 ssl
lrwxrwxrwx    1 root     root           10 Dec 22 20:57 tmp -> ../var/tmp

La primera columna muestra información de permisos para cada elemento del listado. Voy a explicar cómo interpretar esta información más adelante. La siguiente columna muestra el número de enlaces a cada objeto del sistema de archivos, que pasaremos por alto ahora, pero volveremos a ello más tarde. Las columnas tercera y cuarta listan el propietario y el grupo, respectivamente. La quinta columna muestra el tamaño del objeto. La sexta columna es el tiempo de "última modificación" o "mtime" del objeto. La última columna es el nombre del objeto. Si el archivo es un enlace simbólico, verá un apuntador -> y la ruta a la que apunta el enlace simbólico.

Mirando los directorios

A veces, usted querrá mirar un directorio, en lugar de dentro de él. Para estas situaciones, puede especificar la opción -d, que le dirá a ls que busque en cualquier directorio que normalmente buscaría en su interior:

$ ls -dl /usr /usr/bin /usr/X11R6/bin ../share
drwxr-xr-x    4 root     root           96 Dec 18 18:17 ../share
drwxr-xr-x   17 root     root          576 Dec 24 09:03 /usr
drwxr-xr-x    2 root     root         3192 Dec 26 12:52 /usr/X11R6/bin
drwxr-xr-x    2 root     root        14576 Dec 27 08:56 /usr/bin

Listados recursivos e inode

Así que puede usar -d para buscar en un directorio, pero también puede usar -R para hacer lo contrario: no sólo mirar dentro de un directorio, sino recursivamente buscar dentro de todos los archivos y directorios dentro de ese directorio! No incluiremos ningún ejemplo de salida para esta opción (ya que generalmente es voluminosa), pero es posible que desee probar algunos comandos ls -R y ls -Rl para obtener una idea de cómo funciona.

Finalmente, la opción ls -i se puede usar para mostrar los números de inodo de los objetos del sistema de archivos en el listado:

$ ls -i /usr
   1409 X11R6        314258 i686-linux           43090 libexec        13394 sbin
   1417 bin            1513 i686-pc-linux-gnu     5120 local          13408 share
   8316 distfiles      1517 include                776 man            23779 src
     43 doc            1386 info                 93892 portage        36737 ssl
  70744 gentoo-x86     1585 lib                   5132 portage.old      784 tmp

Comprensión de los inodos

A cada objeto de un sistema de archivos se le asigna un índice único, denominado número de inodo. Esto puede parecer trivial, pero entender los inodes es esencial para entender muchas operaciones del sistema de archivos. Por ejemplo, considere los enlaces . y .. que aparecen en cada directorio. Para entender completamente lo que realmente es un directorio, primero echaremos un vistazo al número de inodo de /usr/local:

$ ls -id /usr/local
   5120 /usr/local

El directorio /usr/local tiene un número de inodo de 5120. Ahora echemos un vistazo al número de inodo de /usr/local/bin/ ..:

$ ls -id /usr/local/bin/..
   5120 /usr/local/bin/..

Como puede ver, /usr/local/bin/ tiene el mismo número de inode que /usr/local! Así es como podemos enfrentarnos a esta sorprendente revelación. En el pasado, hemos considerado a / usr / local como el propio directorio. Ahora, descubrimos que el inode 5120 es de hecho el directorio, y hemos encontrado dos entradas de directorio (llamadas "enlaces") que apuntan a este inodo. Ambos /usr/local y /usr/local/bin/.. son enlaces a inode 5120. Aunque inode 5120 sólo existe en un lugar en el disco, varias cosas enlazan a él. Inode 5120 es la entrada real en el disco.

De hecho, podemos ver el número total de veces que el inodo 5120 se referenciado usando el comando

ls -dl

:

$ ls -dl /usr/local
drwxr-xr-x    8 root     root          240 Dec 22 20:57 /usr/local

Si echamos un vistazo a la segunda columna de la izquierda, vemos que el directorio / usr / local (inode 5120) se hace referencia ocho veces. En mi sistema, aquí están los varios caminos que hacen referencia a este inodo:

/usr/local
/usr/local/.
/usr/local/bin/..
/usr/local/games/..
/usr/local/lib/..
/usr/local/sbin/..
/usr/local/share/..
/usr/local/src/..

mkdir

Echemos un rápido vistazo al comando mkdir, que se puede utilizar para crear nuevos directorios. El siguiente ejemplo crea tres nuevos directorios, tic, tac y toe, todos bajo

$ cd /tmp
$ mkdir tic tac toe

De forma predeterminada, el comando mkdir no crea directorios principales para usted; toda la ruta desde el primer elemento hasta el último necesita existir. Por lo tanto, si desea crear los directorios ganados won/der/ful, necesitará emitir tres comandos mkdir independientes:

$ mkdir won/der/ful
mkdir: cannot create directory `won/der/ful': No such file or directory
$ mkdir won
$ mkdir won/der
$ mkdir won/der/ful

Sin embargo, mkdir tiene una opción práctica -p que le dice a mkdir que cree cualquier directorio padre faltante, como puede ver aquí:

$ mkdir -p easy/as/pie

En general, es bastante sencillo. Para obtener más información sobre el comando mkdir, escriba man mkdir para leer la página de manual. Esto funcionará para casi todos los comandos cubiertos aquí (por ejemplo, man ls), excepto para cd, que está incorporado en bash.

touch

Ahora, vamos a echar un vistazo rápido a los comandos cp y mv, utilizados para copiar, cambiar el nombre y mover archivos y directorios. Para comenzar esta descripción, primero usaremos el comando touch para crear un archivo en /tmp:

$ cd /tmp
$ touch copyme

El comando touch actualiza el "mtime" de un archivo si existe (recuerde la sexta columna en la salida ls -l). Si el archivo no existe, se creará un nuevo archivo vacío. Ahora debe tener un archivo /tmp/copyme con un tamaño de cero.

echo

Ahora que el archivo existe, vamos a agregar algunos datos al archivo. Podemos hacerlo usando el comando echo, que toma sus argumentos y los imprime a la salida estándar. En primer lugar, el comando de eco en sí mismo:

$ echo "firstfile"
firstfile

Ahora, el mismo comando de eco con redirección de salida:

$ echo "firstfile" > copyme

El signo mayor que indica al shell que escriba la salida de eco en un archivo llamado copyme. Este archivo se creará si no existe y se sobrescribirá si existe. Escribiendo ls -l, podemos ver que el archivo copyme tiene 10 bytes de largo, ya que contiene la palabra firstfile y el caracter newline:

ls -l, we can see that the copyme file is 10 bytes long, since it contains the word firstfile and the newline character:

$ ls -l copyme
-rw-r--r--    1 root     root           10 Dec 28 14:13 copyme

cat y cp

Para mostrar el contenido del archivo en el terminal, utilice el comando cat:

$ cat copyme
firstfile

Ahora, podemos usar una invocación básica del comando cp para crear un archivo copiedme copiado del archivo original:

$ cp copyme copiedme

Tras la investigación, encontramos que son archivos verdaderamente separados; sus números de inodo son diferentes:

$ ls -i copyme copiedme
  648284 copiedme   650704 copyme

mv

Ahora, vamos a usar el comando mv para cambiar el nombre de "copiedme" a "movedme". El número de inodo permanecerá igual; sin embargo, el nombre de archivo que apunta al inodo cambiará.

$ mv copiedme movedme
$ ls -i movedme
  648284 movedme

El número de inodo de un archivo movido permanecerá igual mientras el archivo de destino resida en el mismo sistema de archivos que el archivo de origen. Echaremos un vistazo a los sistemas de archivos en Fundamentos de Linux parte 3 de esta serie de tutoriales.

Mientras hablamos de mv, veamos otra forma de usar este comando. mv, además de permitirnos cambiar el nombre de los archivos, también nos permite mover uno o más archivos a otra ubicación en la jerarquía de directorios. Por ejemplo, para mover /var/tmp/myfile.txt a /home/drobbins (que pasa a ser mi directorio personal), podría escribir:

$ mv /var/tmp/myfile.txt /home/drobbins

Después de escribir este comando, myfile.txt se moverá a /home/drobbins/myfile.txt. Y si /home/drobbins está en un sistema de archivos diferente de /var/tmp, el comando mv controlará la copia de myfile.txt al nuevo sistema de archivos y lo borrará del antiguo sistema de archivos. Como se puede adivinar, cuando myfile.txt se mueve entre sistemas de archivos, myfile.txt en la nueva ubicación tendrá un nuevo número de inodo. Esto se debe a que cada sistema de archivos tiene su propio conjunto independiente de números de inodo.

También podemos usar el comando mv para mover varios archivos a un único directorio de destino. Por ejemplo, para mover myfile1.txt y myarticle3.txt a /home/drobbins, podría escribir:

$ mv /var/tmp/myfile1.txt /var/tmp/myarticle3.txt /home/drobbins

Creando Enlaces y Removiendo Archivos

Enlaces duros

Hemos mencionado el término "enlace" cuando nos referimos a la relación entre las entradas de directorio (los "nombres" que escribimos) y los inodos (los números de índice en el sistema de archivos subyacente que normalmente podemos ignorar). En realidad hay dos tipos de enlaces disponibles en Linux. El tipo que hemos discutido hasta ahora se llama enlaces duros. Un inodo dado puede tener cualquier número de enlaces duros, y el inodo persistirá en el sistema de archivos hasta que todos los enlaces duros desaparezcan. Cuando el último vínculo duro desaparezca y ningún programa mantenga abierto el archivo, Linux eliminará el archivo automáticamente. Se pueden crear nuevos vínculos duros mediante el comando ln:

$ cd /tmp
$ touch firstlink
$ ln firstlink secondlink
$ ls -i firstlink secondlink
  15782 firstlink    15782 secondlink

Como puede ver, los enlaces duros funcionan en el nivel de inodo para apuntar a un archivo en particular. En sistemas Linux, los enlaces duros tienen varias limitaciones. Por un lado, sólo puede hacer enlaces duros a los archivos, no a los directorios. Está bien; aunque . y .. son enlaces duros a los directorios creados por el sistema, usted (incluso como el usuario "root") no están autorizados a crearlos por cuenta propia. La segunda limitación de los enlaces duros es que no pueden abarcar los sistemas de archivos; que sería el caso si los sistemas de archivos se encuentran en particiones de disco independientes. Esto significa que no puede crear un enlace desde /usr/bin/bash a /bin/bash si sus directorios / y /usr existen en particiones de disco separadas.

Enlaces simbólicos

En la práctica, los enlaces simbólicos (o symlinks) se utilizan con más frecuencia que los enlaces duros. Los enlaces simbólicos son un tipo de archivo especial donde el vínculo se refiere a otro archivo por nombre, en lugar de directamente al inodo. Los enlaces simbólicos no impiden que se elimine un archivo; Si el archivo de destino desaparece, entonces el enlace simbólico sólo será inutilizable o roto.

Se puede crear un enlace simbólico pasando la opción -s a ln.

$ ln -s secondlink thirdlink
$ ls -l firstlink secondlink thirdlink
-rw-rw-r--    2 agriffis agriffis        0 Dec 31 19:08 firstlink
-rw-rw-r--    2 agriffis agriffis        0 Dec 31 19:08 secondlink
lrwxrwxrwx    1 agriffis agriffis       10 Dec 31 19:39 thirdlink -> secondlink

Los enlaces simbólicos se pueden distinguir en ls -l salida de archivos normales de tres maneras. En primer lugar, observe que la primera columna contiene un carácter l para indicar el enlace simbólico. En segundo lugar, el tamaño del enlace simbólico es el número de caracteres en el destino (segundo enlace, en este caso). En tercer lugar, la última columna de la salida muestra el nombre de archivo de destino precedido por una flecha ->.

Symlinks en profundidad

Los enlaces simbólicos son generalmente más flexibles que los enlaces duros. Puede crear un vínculo simbólico con cualquier tipo de objeto del sistema de archivos, incluidos los directorios. Y debido a que la implementación de enlaces simbólicos se basa en rutas (no en inodos), está perfectamente bien crear un enlace simbólico que apunte a un objeto en otro sistema de archivos físico; es decir, una partición de disco diferente. Sin embargo, este hecho también puede hacer que los enlaces simbólicos sean difíciles de entender.

Considere una situación donde queremos crear un enlace en /tmp que apunte a /usr/local/bin. Deberíamos escribir esto:

$ ln -s /usr/local/bin bin1
$ ls -l bin1
lrwxrwxrwx    1 root     root           14 Jan  1 15:42 bin1 -> /usr/local/bin

O alternativamente:

$ ln -s ../usr/local/bin bin2
$ ls -l bin2
lrwxrwxrwx    1 root     root           16 Jan  1 15:43 bin2 -> ../usr/local/bin

Como puede ver, ambos enlaces simbólicos apuntan al mismo directorio. Sin embargo, si nuestro segundo enlace simbólico es movido a otro directorio, se "romperá" debido a la ruta relativa:

$ ls -l bin2
lrwxrwxrwx    1 root     root           16 Jan  1 15:43 bin2 -> ../usr/local/bin
$ mkdir mynewdir
$ mv bin2 mynewdir
$ cd mynewdir
$ cd bin2
bash: cd: bin2: No such file or directory

Debido a que el directorio /tmp/usr/local/bin no existe, ya no podemos cambiar los directorios en bin2; en otras palabras, bin2 está ahora roto.

Por esta razón, a veces es una buena idea evitar crear enlaces simbólicos con la información de ruta relativa. Sin embargo, hay muchos casos donde los enlaces simbólicos relativos son muy útiles. Considere un ejemplo en el que desea crear un nombre alternativo para un programa en /usr/bin:

# ls -l /usr/bin/keychain 
-rwxr-xr-x    1 root     root        10150 Dec 12 20:09 /usr/bin/keychain

Como usuario root, puede crear un nombre alternativo para "llavero", como "kc". En este ejemplo, tenemos acceso de root, como lo demuestra nuestro indicador bash cambiando a "#". Necesitamos acceso root porque los usuarios normales no pueden crear archivos en /usr/bin. Como root, podríamos crear un nombre alternativo para keychain de la siguiente manera:

# cd /usr/bin
# ln -s /usr/bin/keychain kc
# ls -l keychain
-rwxr-xr-x    1 root     root        10150 Dec 12 20:09 /usr/bin/keychain
# ls -l kc       
lrwxrwxrwx    1 root     root           17 Mar 27 17:44 kc -> /usr/bin/keychain

En este ejemplo, creamos un enlace simbólico llamado kc que apunta al archivo /usr/bin/keychain.

Si bien esta solución funcionará, creará problemas si decidimos que queremos mover ambos archivos, /usr/bin/keychain y /usr/bin/kc a /usr/local/bin:

# cd /usr/bin
# ln -s keychain kc
# ls -l kc
lrwxrwxrwx    1 root     root            8 Jan  5 12:40 kc -> keychain
# mv keychain kc /usr/local/bin
# ls -l /usr/local/bin/keychain
-rwxr-xr-x    1 root     root        10150 Dec 12 20:09 /usr/local/bin/keychain
# ls -l /usr/local/bin/kc
lrwxrwxrwx    1 root     root           17 Mar 27 17:44 kc -> keychain

Debido a que usamos un camino absoluto en nuestro enlace simbólico, nuestro enlace simbólico kc sigue apuntando a /usr/bin/ keychain, que ya no existe desde que movimos /usr/bin/keychain a /usr/local/bin.

Eso significa que kc es ahora un enlace simbólico roto. Tanto las rutas relativas como las absolutas en los enlaces simbólicos tienen sus méritos, y debe usar un tipo de ruta que sea apropiado para su aplicación particular. A menudo, un camino relativo o absoluto funcionará bien. El ejemplo siguiente habría funcionado incluso después de mover ambos archivos:

# cd /usr/bin
# ln -s keychain kc
# ls -l kc
lrwxrwxrwx    1 root     root            8 Jan  5 12:40 kc -> keychain
# mv keychain kc /usr/local/bin
# ls -l /usr/local/bin/keychain
-rwxr-xr-x    1 root     root        10150 Dec 12 20:09 /usr/local/bin/keychain
# ls -l /usr/local/bin/kc
lrwxrwxrwx    1 root     root           17 Mar 27 17:44 kc -> keychain

Ahora, podemos ejecutar el programa keychain escribiendo /usr/local/bin/kc. /usr/local/bin/kc apunta al llavero del programa en el mismo directorio que kc.