La Ruta del SysAdmin - Recorriendo directorios y archivos
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 elhome
de tu usuario:/home/usuario
-
Directorio en el que estaba antes. Permite volver al directorio en el que estaba situado antes de ejecutar el comandocd /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 comandocd
sin ningún nombre de directorio, te llevará al directoriohome
de tu usuario, es lo mismo que escribircd ~
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 atmp
, luego aRUTA
y por último adirectorio2
cd
con ruta relativa:cd ../directorio2
La traducción de los pasos para cambiarse sería: cámbiate al directorio anterior..
y luego cámbiate aldirectorio2
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 !
Navegación avanzada entre directorios
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 directoriospopd
: Leer la pila (ultimo directorio introducido), cambiarnos a él y eliminar ese elementodirs
: Mostrar el contenido de directorios que existen en la pila.
Te recomiendo usarlo con el parámetro -vdirs -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.