La Ruta del SysAdmin - Recorriendo directorios y archivos

La ruta del SysAdmin 2 de jun. de 2024

Recorriendo el "laberinto"

En el post anterior vimos la estructura FHS (El Estándar de Jerarquía de Directorios) de GNU/Linux y vimos que el directorio / (raíz) es un montaje de una partición de un disco duro, además cualquier directorio puede o bien ser un directorio que cuelga directamente del directorio raíz o puede ser una partición montada sobre un directorio, que es siempre parte de la estructura de directorios que parte del directorio /

O vamos a explicar los comandos que nos permiten desplazarnos por esta estructura de una forma cómoda desde la línea de comando.

¿Donde estoy?

En cuanto abres la terminal, dependiendo de la configuración de tu prompt, puede que veas el directorio en el que estás situado, ya sea de forma simplificada, completa o simplemente no aparezca esta información.

El comando que nos permite saber en que rama del directorio actual estamos ubicado actualmente es pwd, vamos a probarlo:

luisgulo@Debian·SysAdmin:~$ pwd
/home/luisgulo

Perfecto... ya se donde estoy ¿o no?

Listando el contenido

Para ver (listar) el contenido del directorio actual debes usar el comando ls (abreviatura de list).

luisgulo@Debian·SysAdmin:~$ ls

 aprende-con-scl.txt              Música
 Descargas                        Doc1
 Plantillas                       Doc1-enlace                      
 Documentos                       Público
 DOSBOX                           SCL
 Escritorio                       SOLOCONLINUX
 GITEA                            viaje-en-el-tiempo-VIM.txt
 GIT-Resumido.dia                 Vídeos
 Imágenes                        'VirtualBox VMs'
 

El comando ls permite usa serie de parámetros, que puedes usar sueltos o en conjunto para modificar la forma en que se muestra el contenido del directorio que desees consultar:

# Listar en formato largo
ls -l

# Listar en formato "1 columna"
ls -1

# Listar archivos ocultos (ficheros y directorios con .nombre)
ls -a

# Listar mostrando numero de inodo de archivo

# Listar ordenado por fecha (mas recientes arriba)
ls -t

# Listar invirtiendo orden (reverso)
ls -r

# Combinando (formato largo, todos, orden inverso)
ls -latr

Recuerda que dispones de la página man de cualquier comando para aprender más sobre cada uno de ellos, y que algunos comando disponen de ayuda directa escribiendo como parámetro --help

# Mostrar manual del comando "ls"
man ls

# Ayuda directa del propio comando
ls --help

Entendiendo la salida de ls

Vamos a usar el comando ls -la (listar todos y en formato largo), para ver explicar en detalle los datos que se muestran en columnas:

$ ls -la
total 12
drwxr-xr-x  3 luisgulo luisgulo 160 jun  2 13:36 .
drwxrwxrwt 21 root     root     480 jun  2 13:33 ..
drwxr-xr-x  2 luisgulo luisgulo  40 jun  2 13:34 directorio1
lrwxrwxrwx  1 luisgulo luisgulo  11 jun  2 13:34 dir-enlace -> directorio1
-rw-r--r--  2 luisgulo luisgulo  53 jun  2 13:34 fich-duro
lrwxrwxrwx  1 luisgulo luisgulo   8 jun  2 13:34 fich-enlace -> fichero1
-rw-r--r--  2 luisgulo luisgulo  53 jun  2 13:34 fichero1
-rw-r--r--  1 luisgulo luisgulo  12 jun  2 13:36 .fich-oculto
-rwxr-xr-x  1 luisgulo luisgulo  10 jun  2 13:48 script.sh

1ª Columna

Tipo de Archivo (1ª Columna - Primera letra):

d para directorio
- para ficheros
l para enlaces simbólicos
c para ficheros especiales de tipo caracter
b para ficheros especiales de dispositivo de bloques

Permisos UGO (1ª Columna - últimos 9 caracteres):
Indican los permisos en formato UGO (Usuario/Grupo/Otros)

UGO = Usuario / Grupo / Otros
Valores posibles: rwx- 
        r (lectura) 
        w (escritura) 
        x (ejecución/atravesar directorio) 
        - (sin permiso)
        
USU GRP OTR
rwx rwx rwx

Los permisos U (usuario), son los permisos que tiene sobre ese archivo (fichero/directorio) el propietario.

Los permiso G (grupo), son los permisos que tienen los usuarios que pertenecen al mismo grupo que el propietario del archivo.

Los permisos O (otros), son los permisos que tiene cualquier otro usuario que no sea el propietario o un usuario del grupo propietarios del archivo.

En GNU/Linux, los permiso se pueden usar tanto en formato UGO, como en formato octal, y es importante saber como pasar de un formato a otro, para simplificar por ejemplo la asignación de permisos.

Calcular el valor octal de los permisos
Cuando se ajustan los permisos de un archivo (fichero o directorio), lo más rápido es escribirlo en formato octal

Al principio es un poco complicado, pero te dejo una "regla mnemotécnica" sencilla para calcularlo:

Mnemotécnico para obtener el valor "octal" de cada parte del permiso UGO:
   rwx
   421
   - Si aparece un guión en una posición ese valor es 0   
Tan solo suma los valores de las posiciones y obtendras el permiso en octal.

Ejemplos:
rwx rwx rwx
421 421 421 => 4+2+1 4+2+1 4+2+1 => 777 (permiso octal)

rwx r-x r-w
421 401 401 => 4+2+1 4+1 4+1 => 755 (permiso octal)

r-- --- ---
400 000 000 => 4 0 0 => 400 (permiso octal)

Practica intentando "traducir" cada valor UGO (rwxrwxrwx) a su valor octal.
Cuando lo hayas calculado mentalmente puedes comprobar el valor mediante el comando stat, fijándote en la línea "Acceso":

$ ls -l script.sh 
-rwxr-xr-x 1 luisgulo luisgulo 10 jun  2 13:48 script.sh

luisgulo@Debian·SysAdmin:/tmp/RUTA$ stat script.sh 
  Fichero: script.sh
...
Acceso: (0755/-rwxr-xr-x)  Uid: ( 1000/luisgulo)   Gid: ( 1000/luisgulo)
...

También puedes usar stat con el siguiente formato de salida para ver unicamente los permisos en UGO y octal directamente:

stat ARCHIVO --printf "%a %A\t%n\n"

Ejemplo:

$ stat fichero1 --printf "%a %A\t%n\n"
644 -rw-r--r--	fichero1

Te puedes incluso crear un alias para el comando para mostrar los valores cuando quieras:

alias lsoctal='stat --printf "%a %A\t%n\n"'

Uso:

$ lsoctal *
755 drwxr-xr-x	directorio1
777 lrwxrwxrwx	dir-enlace
644 -rw-r--r--	f-duro
644 -rw-r--r--	fich-duro
777 lrwxrwxrwx	fich-enlace
644 -rw-r--r--	fichero1
755 -rwxr-xr-x	script.sh

Te dejo una tabla con todos los valores en formato UGO y formato octal y su significado a nivel de permisos:

UGO Octal (421) Permiso asignado
rwx 7 Todos los permisos
rw- 6 Lectura y Escritura
r-w 5 Lectura y Ejecución
r-- 4 Sólo Lectura
-wx 3 Escritura y Ejecución
-w- 2 Sólo Escritura
--x 1 Sólo Ejecución
--- 0 Ningún permiso

2ª Columna
Te muestra el número de enlaces duros para los ficheros y el número de enlaces simbólicos para los directorios.

3ª y 4ª Columna
Indican el propietario usuario y grupo del archivo (fichero o directorio)

5ª Columna
Tamaño en bytes del archivo

6ª, 7ª y 8ª Columna
La fecha y hora de la última modificación del archivo.

9ª Columna
Nombre del archivo (fichero o directorio)

Moviéndose por los directorios

Perfecto, ya sabes distinguir entre un directorio y un fichero simplemente inspeccionando la primera línea al realizar un ls -l

Para cambiarse de un directorio a otro usaremos el comando cd, su sintaxis completa es: cd /ruta-directorio

Al usar el nombre de un directorio hay algunos nombres especiales que debes conocer:

  • . Directorio punto. Se refiere al directorio actual (en donde te encuentras)
  • .. Directorio punto punto. Se refiere al directorio anterior en la estructura de rama de directorios.
  • ~ Directorio virgulilla. Es el home de tu usuario: /home/usuario
  • - Directorio en el que estaba antes. Permite volver al directorio en el que estaba situado antes de ejecutar el comando cd /ruta-directorio
  • / Directorio raíz. Del que cuelga toda la estructura de ramas de directorios.
Nota 1: El carácter / se utiliza como "separador de directorios", cuando aparece en la ruta de directorios.
Nota 2: Usar el comando cd sin ningún nombre de directorio, te llevará al directorio home de tu usuario, es lo mismo que escribir cd ~

Vamos a ver con un ejemplo como nos moveríamos desde una ruta de directorio a otra.

Supongamos la siguiente estructura dentro del directorio /tmp:

/
├──tmp
│  └──RUTA
│     ├── directorio1
│     ├── directorio2
│     ├── dir-enlace -> directorio1
│     ├── f-duro
│     ├── fich-duro
│     ├── fich-enlace -> fichero1
│     ├── fichero1
│     └── script.sh
│   ...
      

Tenemos 2 conceptos nuevos que aprender:

  • Ruta Absoluta: Es la ruta completa que se indica partiendo siempre desde el directorio / para llegar a un directorio.
  • Ruta Relativa: Es la ruta que se indica para alcanzar un directorio, indicado desde la posición actual.

Supongamos que estamos dentro de directorio1, si queremos ir a directorio2 podemos hacerlo mediante:

  • cd con ruta absoluta: cd /tmp/RUTA/directorio2
    El proceso traducido sería: cámbiate al directorio /, luego a tmp, luego a RUTA y por último a directorio2
  • cdcon ruta relativa: cd ../directorio2
    La traducción de los pasos para cambiarse sería: cámbiate al directorio anterior .. y luego cámbiate al directorio2
Fíjate que siempre se utiliza el carácter  / para separar cada uno de los nombres de directorios.

Si ejecutas pwd verás que de ambas formas te has cambiado a directorio2:

$ pwd
/tmp/RUTA/directorio2

Ahora vamos a cambiarnos al directorio dir-enlace, usaremos la ruta relativa y luego ejecutaremos pwd para ver si estamos correctamente situados:

$ cd ../dir-enlace
$ pwd
/tmp/RUTA/dir-enlace

Vamos a ejecutar el comando pwd , pero vamos a usar el parámetro -P que nos indica la ubicación física real de donde nos encontramos.
Observa la diferencia entre la ejecución de pwd desde el mismo directorio:

luisgulo@Debian·SysAdmin:/tmp/RUTA/dir-enlace$ pwd
/tmp/RUTA/dir-enlace

luisgulo@Debian·SysAdmin:/tmp/RUTA/dir-enlace$ pwd -P
/tmp/RUTA/directorio1

Estamos correctamente situados, pero si recuerdas en los primeros ls -l que ejecutamos aparecía que este directorio es un archivo de tipo "enlace".
Veremos el tema de los enlaces más adelante.

Creación de Directorios

Para crear un directorio dispones del comando mkdir, si no indicas ninguna ruta se creará a partir del directorio actual.

mkdir Doc1 Crea el directorio "Doc1" en la ruta actual (en nuestro caso sería ahora mismo /tmp/RUTA/dir-enlace)

mkdir /tmp/Doc1 Creará el directorio "Doc1" dentro de /tmp ya que hemos indicado una ruta absoluta.

Nota: Sólo se puede crear un nuevo directorio si existe el directorio padre del directorio a crear.

Si queremos crear una ruta completa sin tener que escribir cada vez cada uno de los directorios, se puede hacer en un único paso.

Ejemplo: Crear ruta de directorio /tmp/R1/R2/R3/R4

Crear paso a paso, generando el "padre" necesario:

mkdir /tmp/R1
mkdir /tmp/R1/R2
mkdir /tmp/R1/R2/R3
mkdir /tmp/R1/R2/R3/R4

Crear estructura completa en un único paso:

mkdir -p /tmp/R1/R2/R3/R4

El parámetro -p permite generar automaticamente los directorios "padre" si no existen.

Creación de Ficheros

Para crear un fichero vacío, puedes usar el comando touch FICHERO, y se creará en el directorio actual, o indicar la ruta absoluta/relativa de donde se tiene que crear.

Borrado de Archivos (Ficheros y Directorios)

Borrado de ficheros
Para borrar un fichero usaremos el comando rm seguido del nombre del fichero. Recuerda que no es necesario estar en el mismo lugar donde esté ubicado el fichero, ya que puedes usar la ruta absolutas o relativa para indicar el fichero a borrar: rm /ruta/nombre-fichero

Borrado de directorios
Para borrar un directorio usaremos el comando rmdir, sólo puedes eliminar un directorio si no hay ningún otro archivo dentro de él (fichero o subdirectorio)

# Creamos directorio en ruta actual (/tmp/RUTA)
luisgulo@Debian·SysAdmin:/tmp/RUTA$ mkdir BORRAME

# Creamos un fichero dentro del nuevo directorio
luisgulo@Debian·SysAdmin:/tmp/RUTA$ touch BORRAME/fichero

# Intentamos borrar directorio (tiene fichero dentro)
luisgulo@Debian·SysAdmin:/tmp/RUTA$ rmdir BORRAME
rmdir: fallo al borrar 'BORRAME': El directorio no está vacío

# Borramos fichero del directorio para que quede vacio
luisgulo@Debian·SysAdmin:/tmp/RUTA$ rm BORRAME/fichero

# Borramos directorio (ahora si deja !)
luisgulo@Debian·SysAdmin:/tmp/RUTA$ rmdir BORRAME

Borrado recursivo
El comando rm permite usar como parámetro -r para realizar un borrado recursivo, eso permite incluso borrar un directorio y todo lo que contenga, ya sean ficheros u otros subdirectorios. ¡ Úsalo con mucha precaución !

El comando cd - te lleva del directorio actual al que habías estado antes, lo cual te permite ir y volver entre esos 2 directorios muy fácilmente.
Veamos un ejemplo:

# Nos vamos al home de nuestro usuario
$ cd ~
$ pwd
/home/luisgulo

# Nos cambiamos a otro directorio
$ cd /tmp/RUTA/directorio1
$ pwd
/tmp/RUTA/directorio1

# Volver a directorio previo
$ cd -
$ pwd 
/home/luisgulo

# Volver a directorio previo
$ cd -
$ pwd 
/tmp/RUTA/directorio1

Si vas a estar trabajando con numerosos directorios y no quieres estar todo el rato cortando y pegando el nombre o escribiendo continuamente la ruta, existe una forma muy sencilla, mediante la creación de una "pila de directorios".

Creación de la pila de directorios
Para crear tu propia "lista" de directorios, usaremos el comando pushd para cambiar e incluir directorios, el comando popd para retroceder y el comando dirs para listar el contenido de la pila de directorios.

  • pushd: Cambiar a un directorio e incluirlo en la "pila" de directorios
  • popd: Leer la pila (ultimo directorio introducido), cambiarnos a él y eliminar ese elemento
  • dirs: Mostrar el contenido de directorios que existen en la pila.
    Te recomiendo usarlo con el parámetro -v dirs -v (luego verás porqué)

Veamos como te aconsejo usar estos comandos:

# Supongamos que necesito trabajar con 4 directorios:
/home/luisgulo/Documentos
/tmp/RUTA
/tmp/RUTA/directorio1
/tmp/RUTA/directorio2

# Vamos a comprobar que tiene la "pila" de directorios:
$ dirs -v
 0  ~


# Utilizo pushd -n para "incluirlos de uno en uno"
# Y almacenarlos sin perderlos en su uso, ni moverme.
$ pushd -n /home/luisgulo/Documentos/
~/Documentos ~

# Reviso lo que se van guardando en la pila...
$ dirs -v 
 0  ~
 1  ~/Documentos

# Continuo con los otros directorios...
$ pushd -n /tmp/RUTA/
/tmp/RUTA ~/Documentos ~
$ dirs -v
 0  ~
 1  /tmp/RUTA/
 2  ~/Documentos/

$ pushd -n /tmp/RUTA/directorio1
$ pushd -n /tmp/RUTA/directorio2

$ dirs -v
 0  ~
 1  /tmp/RUTA/directorio2
 2  /tmp/RUTA/directorio1
 3  /tmp/RUTA/
 4  ~/Documentos/

Nota: el 0 será siempre la ruta en la que estoy
Perfecto, ya tengo todos los directorios almacenados en la "pila"

Si usase popd me cambiaría al elemento 0 de la pila y se borraría.
Sin embargo puedo usar cada elemento de esa pila usando su número precedido del símbolo ~ para cambiarme a él o usarlo como directorio, sin perderlo y usarlo repetidamente...

# Revisar la "pila"
$ dirs -v
 0  ~
 1  /tmp/RUTA/directorio2
 2  /tmp/RUTA/directorio1
 3  /tmp/RUTA/
 4  ~/Documentos/
 
 # Ejemplo: Crear ficheros usando rutas de la "pila" (~NUM)
 $ touch ~2/fichero-en-dir1 
 $ touch ~1/fichero-en-dir2
 
 # Reviso contenido de los directorios:
 $ ls -l ~2
/tmp/RUTA/directorio1/:
total 0
drwxr-xr-x 2 luisgulo luisgulo 40 jun  2 17:17 Doc1
-rw-r--r-- 1 luisgulo luisgulo  0 jun  2 21:55 fichero-en-dir1

$ ls -l ~1
/tmp/RUTA/directorio2/:
total 0
-rw-r--r-- 1 luisgulo luisgulo 0 jun  2 21:55 fichero-en-dir2

# Ejemplo: Borrar directorio usando ruta de la pila
# Nota: Comprobar siempre antes contenido de la pila,
$ dirs -v
 0  ~
 1  /tmp/RUTA/directorio2
 2  /tmp/RUTA/directorio1
 3  /tmp/RUTA/
 4  ~/Documentos/

$ rmdir ~2/Doc1
$ ls -l ~2
total 0
-rw-r--r-- 1 luisgulo luisgulo 0 jun  2 21:55 fichero-en-dir1

En cuanto termine de trabajar con la "pila" de directorios la puedo borrar usando el parámetro -c (clean) del comando dirs:

# Compruebo contenido de la pila:
 0  ~
 1  /tmp/RUTA/directorio2
 2  /tmp/RUTA/directorio1
 3  /tmp/RUTA/
 4  ~/Documentos/
 
# Vacio la pila:
$ dirs -c
# Compruebo que contiene ahora la pila:
$ dirs -v
 0  ~

Vaciada completamente !

Resumen:

  • Usamos  pushd -n DIR para crear elementos en la pila sin cambiar de directorio.
  • Usamos dirs -v para revisar el contenido de la pila y ver su número.
  • Usamos el número de elemento de la pila precedido de una virgulilla  ` para realizar acciones con ese elemento comando ~NumElementoPila

Enlaces en GNU/Linux

Tienes que saber que en GNU/Linux existen algo que se denominan "enlaces", se pueden enlazar tanto ficheros como directorios.

No es lo mismo que en otros sistemas operativos, en los que esos enlaces son simples ficheros que contienen la información del fichero que se quiere abrir.

En GNU/Linux los enlaces se comportan como un puntero en la tabla de particiones que indican a que archivo (fichero o directorio) están enlazados, este proceso se realiza apuntando al número de inodo.

Recuerda que puedes ver el número de inodo de un archivo (fichero o directorio) mediante el comando ls -i

Además para complicar un poco más la cosa, disponemos de dos tipos diferentes de enlaces: enlaces simbólicos y enlaces duros.

  • Enlace duro: Este tipo archivo creado tiene el mismo número de inodo que el archivo enlazado y sólo se pueden crear sobre archivos (no sobre directorios) y además sólo si el archivo está en la misma partición del archivo al que enlazamos.
    Tanto el fichero inicial como sus enlaces duros son ahora el mismo fichero, si editas cualquiera de ellos, se cambia el contenido en todos ellos. Los datos persisten hasta que se borre el último de los ficheros con idéntico inodo
  • Enlace simbólico: Este archivo tiene su propio número de inodo, pero al usarlo nos redirige al archivo enlazado (fichero o directorio).

El comando para crear enlaces es ln, puedes usarlo de la siguiente forma:

# Enlace duro (ln sin parámetros)
ln Archivo nombre-Archivo-enlace-duro

# Enlace simbólico (ln con parámetro -s)
ln -s Directorio Directorio-enlazado
ln -s Archivo nombre-Archivo-enlace-simbolico

Vamos a crear  una estructura de directorios y un enlace simbólico de un directorio para que veas conozcas algo más sobre el comando pwd:

# Creamos estructura (en un unico paso):
$ mkdir -p /tmp/DIRECTORIO/DIR-01

# Creamos enlace simbólico:
$ ln -s /tmp/DIRECTORIO/DIR-01 /tmp/DIRECTORIO/dir-enlazado

# Nos cambiamos al directorio (que es un enlace simbólico)
$ cd /tmp/DIRECTORIO/dir-enlazado
# Pedimos que nos indique donde estamos (pwd):
$ pwd
/tmp/DIRECTORIO/dir-enlazado

Sin embargo vamos a usar un parámetro especial para pwd:

$ pwd -P
/tmp/DIRECTORIO/DIR-01

Upss... ¿Qué ha pasado?
Nada, simplemente que -P nos muestra el directorio "real" (Physical) en donde estamos trabajando. Por defecto pwd muestra siempre la ubicación lógica del directorio.

Esto es muy útil, si tenemos muchos enlaces o enlaces anidados, para saber realmente cual es la ubicación real en el árbol de directorios.

Practica lo que has leído aquí y sobre todo usa el man para averiguar que otras opciones tiene cada uno de los comandos que hemos visto en esta entrada.

Etiquetas

Luis GuLo

🐧 SysAdmin GNU/Linux - 🐳 Docker - 🖥️ Bash Scripting - 🐪 Perl - 🐬 MySQL - 👥 Formador de TI - 👥 Formador de SysAdmin's - 💢 Ansible - ☁️ Cloud Computing - ❤️ Debian GNU/Linux