Note

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

User talk:Arlesy

From Funtoo
Jump to navigation Jump to search

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

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 retroceder

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 Linux Fundamentals, Part 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 keychain, 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.

rm

Ahora que sabemos cómo usar cp, mv y ln, es hora de aprender a eliminar objetos del sistema de archivos. Normalmente, esto se hace con el comando rm. Para eliminar archivos, simplemente especifíquelos en la línea de comandos:

$ cd /tmp
$ touch file1 file2
$ ls -l file1 file2
-rw-r--r--    1 root     root            0 Jan  1 16:41 file1
-rw-r--r--    1 root     root            0 Jan  1 16:41 file2
$ rm file1 file2
$ ls -l file1 file2
ls: file1: No such file or directory
ls: file2: No such file or directory

Tenga en cuenta que bajo Linux, una vez que un archivo es removido, normalmente se va para siempre. Por esta razón, muchos administradores de sistema junior utilizarán la opción -i al eliminar archivos. La opción -i le dice a rm que elimine todos los archivos en modo interactivo, es decir, antes de quitar cualquier archivo. Por ejemplo:

$ rm -i file1 file2
rm: remove regular empty file `file1'? y
rm: remove regular empty file `file2'? y

En el ejemplo anterior, el comando rm indicó si los archivos especificados deberían *realmente* eliminarse. Para que se eliminaran, tuve que escribir "y" y presionar Enter dos veces. Si hubiera escrito n, el archivo no se habría eliminado. O, si hubiera hecho algo realmente mal, podría haber tecleado Control-C para abortar el comando rm -i enteramente - todo antes de poder hacer cualquier daño potencial a mi sistema. Si todavía se está acostumbrando al comando rm, puede ser útil agregar la siguiente línea al archivo ~ / .bashrc usando su editor de texto favorito y luego cerrar la sesión y volver a iniciarla. Entonces, cada vez que escriba rm, El shell de bash lo convertirá automáticamente en un comando rm -i. De esta manera, rm siempre funcionará en modo interactivo:

alias rm="rm -i"

rmdir

Para quitar directorios, tiene dos opciones. Puede quitar todos los objetos dentro del directorio y luego usar rmdir para quitar el propio directorio:

$ mkdir mydir
$ touch mydir/file1
$ rm mydir/file1
$ rmdir mydir

Este método se conoce comúnmente como eliminación de directorios para bobos. Todos los usuarios avanzados y administradores reales, #worth their salt utilizan el comando rm -rf mucho más conveniente, que se describe a continuación. La mejor manera de eliminar un directorio es utilizar las opciones de fuerza recursiva del comando rm para indicar a rm que elimine el directorio especificado, así como todos los objetos contenidos en el directorio:

$ rm -rf mydir

Generalmente, rm -rf es el método preferido para eliminar un árbol de directorios. Tenga mucho cuidado al usar rm -rf, ya que su poder puede ser usado tanto para el bien como para el mal :)

Uso de comodines

Presentación de comodines

En tu uso cotidiano de Linux, muchas veces necesitas realizar una sola operación (como rm) en muchos objetos del sistema de archivos a la vez. En estas situaciones, a menudo puede resultar engorroso escribir muchos archivos en la línea de comandos:

$ rm file1 file2 file3 file4 file5 file6 file7 file8

Para solucionar este problema, puede aprovechar el soporte de comodines incorporado de Linux. Este soporte, también llamado globbing (por razones históricas), le permite especificar múltiples archivos a la vez usando un patrón comodín. Bash y otros comandos de Linux interpretarán este patrón buscando en el disco y encontrando cualquier archivo que coincida con él. Por lo tanto, si tenía archivos de archivo1 a archivo8 en el directorio de trabajo actual, podría eliminar estos archivos escribiendo:

$ rm file[1-8]

O si simplemente quería eliminar todos los archivos cuyos nombres empiezan por archivo, así como cualquier archivo con nombre archivo, podría escribir:

$ rm file*

El comodín * coincide con cualquier carácter o secuencia de caracteres, o incluso sin carácter. Por supuesto, los comodines glob pueden usarse para algo más que simplemente eliminar archivos, como veremos en el siguiente panel.

Entendiendo las no coincidencias

Si desea listar todos los objetos del sistema de archivos en /etc que comienzan con g, así como cualquier archivo llamado g, podría escribir:

$ ls -d /etc/g*
/etc/gconf  /etc/ggi  /etc/gimp  /etc/gnome  /etc/gnome-vfs-mime-magic  /etc/gpm  /etc/group  /etc/group-

Ahora, ¿qué ocurre si especifica un patrón que no coincide con ningún objeto del sistema de archivos? En el ejemplo siguiente, intentamos listar todos los archivos en /usr/bin que comienzan con asdf y terminan con jkl, incluyendo potencialmente el archivo asdfjkl:

$ ls -d /usr/bin/asdf*jkl
ls: /usr/bin/asdf*jkl: No such file or directory

Esto es lo que pasó. Normalmente, cuando especificamos un patrón, ese patrón coincide con uno o más archivos en el sistema de archivos subyacente, y bash reemplaza el patrón con una lista separada por espacios de todos los objetos coincidentes . Sin embargo, cuando el patrón no produce ninguna coincidencia, bash deja el argumento, wild cards y todos, tal cual . Por lo tanto, entonces ls no puede encontrar el archivo / usr / bin / asdf * jkl y nos da un error. La regla operativa aquí es que los patrones glob se expanden sólo si coinciden con los objetos del sistema de archivos . De lo contrario, permanecen como están y se pasan literalmente al programa que está llamando.

Sintaxis de comodín: * y ?

Ahora que hemos visto cómo globbing funciona, debemos ver la sintaxis de comodines. Puede utilizar caracteres especiales para la expansión de comodines:

* coincidirá con cero o más caracteres. Significa "cualquier cosa puede ir aquí, incluyendo nada". Ejemplos:

  • /etc/g * hace coincidir todos los archivos de /etc que comienzan con g, o un archivo llamado g.
  • /tmp/my * 1 coincide con todos los archivos en /tmp que comienzan con mi y terminan con 1, incluido el archivo my1.

? coincide con cualquier carácter. Ejemplos:

  • mi_archivo? Coincide con cualquier archivo cuyo nombre consta de mi_archivo seguido de un solo carácter
  • /tmp/notes?txt coincidiría con /tmp/notes.txt y /tmp/notes_txt, si existen

Sintaxis de comodín: []

Este comodín es como un ?, Pero permite una mayor especificidad. Para utilizar esta tarjeta comodín, coloque los caracteres que desee coincidir dentro de []. La expresión resultante coincidirá con una sola ocurrencia de cualquiera de estos caracteres. También puede utilizar - para especificar un rango e incluso combinar rangos. Ejemplos:

  • myfile[12] coincidirá myfile1 y myfile2. El comodín se expandirá siempre que al menos uno de estos archivos exista en el directorio actual.
  • [Cc]hange[Ll]og coincidirá con Changelog, ChangeLog, changeLog y changelog. Como puede ver, el uso de comodines puede ser útil para hacer coincidir variaciones en mayúsculas.
  • ls/etc/[0-9] * mostrará todos los archivos de / etc que comiencen con un número.
  • ls/tmp/[A-Za-z] * mostrará todos los archivos en /tmp que comienzan con una letra mayúscula o minúscula.

El constructor [!] es similar al constructor [], excepto que en lugar de coincidir con cualquier carácter dentro de los corchetes, coincidirá con cualquier caracter, siempre y cuando no se encuentra entre la lista [! and]. Ejemplo:

  • rm myfile [! 9] eliminará todos los archivos llamados myfile más un solo carácter, excepto myfile9

Advertencias de comodines

Aquí hay algunas advertencias a tener en cuenta cuando se usan comodines. Dado que bash trata los caracteres comodín (?, [,] y *) especialmente, debe tener especial cuidado al escribir un argumento en un comando que contenga estos caracteres. Por ejemplo, si desea crear un archivo que contenga la cadena [fo] *, el siguiente comando no puede hacer lo que desea:

$ echo [fo]* > /tmp/mynewfile.txt

Si el patrón [fo] * coincide con cualquier archivo del directorio de trabajo actual, encontrarás los nombres de esos archivos dentro de /tmp/mynewfile.txt en lugar de un literal [fo] * como esperabas. ¿La solución? Bueno, un enfoque es rodear a sus caracteres con comillas simples, que dicen a bash que no realizar absolutamente ninguna expansión de comodín en ellos:

$ echo '[fo]*' > /tmp/mynewfile.txt

Utilizando este enfoque, su nuevo archivo contendrá un literal [fo] * como se esperaba. Alternativamente, puede usar la barra invertida para decirle a bash que [,], y * deberían ser tratados literalmente en lugar de como comodines:

$ echo \[fo\]\* > /tmp/mynewfile.txt

Ambos enfoques (comillas simples y barra invertida) tienen el mismo efecto. Dado que estamos hablando de expansión de barra invertida, ahora sería un buen momento para mencionar que para especificar un literal \, también puede incluirlo entre comillas simples o tipo \\ (se expandirá a \) . Nota

   Note

Las comillas dobles funcionarán de forma similar a las comillas simples, pero todavía le permitirán a bash hacer alguna expansión limitada. Por lo tanto, las comillas simples son su mejor apuesta cuando realmente está interesado en pasar el texto literal a un comando. Para obtener más información sobre la expansión de comodines, escriba man 7 glob. Para más información sobre citar en bash, escriba man 8 glob y lea la sección titulada QUOTING. Si está planeando tomar los exámenes LPI, considere esto como una tarea :)

Resumen y recursos

Resumen

Felicitaciones; ¡Has llegado al final de nuestra revisión de los fundamentos de Linux! Espero que le haya ayudado a consolidar su conocimiento básico de Linux. Los temas que has aprendido aquí, incluyendo los conceptos básicos de bash, comandos básicos de Linux, enlaces y comodines, han sentado las bases para nuestro próximo tutorial sobre administración básica, en el que cubriremos temas como expresiones regulares, propiedad y permisos , Administración de cuentas de usuario y más.

Al continuar en esta serie de tutoriales, pronto estarás listo para obtener tu certificación LPIC Level 1 del Linux Professional Institute. Hablando de certificación LPIC, si esto es algo que le interesa, le recomendamos que estudie los recursos en el siguiente panel, que han sido cuidadosamente seleccionados para aumentar el material cubierto en este tutorial.