ARCHIVOS Y DIRECTORIOS

Lo primero que debemos tener siempre presente es que en Linux todo es un archivo, desde las unidades de disco duro y extraíbles hasta los directorios. De hecho, un directorio es un tipo especial de archivo que almacena la dirección en memoria de los archivos y/o subdirectorios que contenga.

Ya vimos que las rutas pueden ser absolutas o relativas: son absolutas cuando comienzan desde el root (/) y pueden ser referenciadas desde cualquier lugar del sistema, y son relativas cuando dependen de la ubicación actual. En las rutas es muy común encontrar un punto (.) o dos puntos seguidos (..): el primero refiere a la ubicación en donde estamos ahora y el segundo se refiere al directorio padre.

Es muy común que los nombres de los archivos contengan espacios, por lo que es importante usar comillas dobles (") al referenciarlos en la terminal. Por ejemplo: "mi archivo.txt".

Otro punto fundamental es que, a diferencia de otros sistemas operativos tales como Windows, donde la extensión es importante porque le indica al sistema qué tipo de archivo es, Linux simplemente ignora la extensión del archivo y se fija en su contenido para determinar de qué tipo es. De esta forma, a un archivo .jpg se le podría cambiar su extensión a .txt y aún así el sistema Linux lo seguiría tratando como a una imagen.

Comando Descripción
whereis (where is?) Busca la ubicación de un archivo ejecutable. Si están disponibles, retorna también su fuente y manual
cd ruta (change directory) Cambia a la ruta indicada, sea absoluta o relativa
cd Vuelve al directorio de inicio (home)
cd .. Sube un nivel en los directorios. ../.. sube dos niveles, ../../.. sube tres y así sucesivamente
cd ../directorio Sube un nivel y enseguida ingresa a otro subdirectorio
cd - Muestra en pantalla el directorio anterior y regresa a él
mkdir directorio
mkdir directorio1 directorio2...
(make directory) Crea uno o varios directorios en la ubicación actual
mkdir -v (-view) Muestra un mensaje sobre el directorio creado
mkdir directorio && cd $_ Crea un directorio y cambia inmediatamente a él
mkdir directorio{01,02,03...} Crea directorios con igual nombre y distinto sufijo (directorio01, directorio02, directorio03...)
mkdir directorio{A..D} (dos puntos) Crea 4 directorios con igual nombre y distinto sufijo: directorioA, directorioB, directorioC y directorioD
mkdir -p subdirectorio1 subdirectorio2... (-parent) Crea uno o varios subdirectorios
mkdir directorio1/directorio2/directorio3... Crea subdirectorios anidados
touch archivo
touch archivo1 archivo2 "archivo_nuevo"...
Crea uno o varios archivos en la ubicación actual [1]
touch archivo{01,02,03...} Crea archivos con igual nombre y distinto sufijo: archivo01, archivo02, archivo03...
touch archivo{A..D} (punto punto) Crea 4 archivos con igual nombre y distinto sufijo: archivoA, archivoB, archivoC y archivoD
touch -m archivo (-modify) Actualiza la fecha de modificación del archivo a la actual
./archivo
bash archivo
Ejecuta un archivo
du -h archivo (disc use -human-readable) Muestra el tamaño que ocupa un archivo o directorio
locate archivo Busca un archivo según su nombre
find ruta -name nombre -type tipo Busca un archivo o directorio con cierto nombre dentro de un directorio dado. La opción -type especifica el tipo: d para directorios, f para archivos
file archivo Muestra una descripción breve del archivo
stat archivo Muestra información detallada sobre un archivo, como su nombre, su tamaño, su fecha de creación, etc.
grep expresión archivo Busca una expresión determinada en cierto archivo
realpath archivo Muestra la ruta absoluta de un archivo
dirname archivo Muestra el directorio padre de un archivo
basename ruta Extrae el nombre de una carpeta o de un archivo con su extensión
basename ruta .extensión Extrae el nombre de un archivo SIN su extensión
basename -a *.extensión (-all) Muestra todos los archivos del directorio actual que tengan cierta extensión
basename -s .extensión -a *.extensión (-suffix) Muestra todos los archivos del directorio actual que tengan cierta extensión, SIN su extensión
cp archivo_original archivo_nuevo (copy) Copia un archivo y crea uno nuevo
cp archivo1 archivo2 archivo3... ruta Copia el o los archivos y los pega en un directorio dado. [1]
cp -i archivo ruta (-interactive) Copia el archivo y lo pega en un directorio dado, pidiendo confirmación
cp * Copia todo el contenido del directorio actual
cp -r directorio1 directorio2... directorio_destino (-recursive) Copia el o los directorios y los pega en otro
cp -r directorio_origen/. directorio_destino Copia solamente el contenido del directorio y lo pega en otro
rmdir directorio (remove directory) Borra un directorio sólo si está vacío
rmdir -v directorio (-verbose) Borra un directorio y muestra un mensaje
rm archivo (remove) Borra un archivo del directorio actual
rm ruta/archivo Borra un archivo de la ruta indicada
rm -r -i archivo (-recursive -interactive) Borra el archivo, pidiendo confirmación
rm -r -f directorio (-force) Fuerza el borrado del directorio.
ATENCIÓN: Debe tenerse muchísimo cuidado con la opción -rf porque no pide confirmación ni arroja error si el directorio no existe.
mv archivo1 archivo2... ruta (move) Mueve uno o varios archivos desde el directorio actual a otro directorio de destino
mv ruta_origen ruta_destino Mueve un archivo o directorio desde ruta_origen a ruta_destino
mv archivo nombre_nuevo Renombra el archivo o directorio
unzip archivo.zip Descomprime un archivo zip
zip -r comprimido.zip archivo1 archivo2... (-recursive) Comprime archivos y directorios con sus contenidos en uno con extensión zip
zip -x comprimido.zip archivo1 archivo2 -x archivo3 (-exclude) Comprime los archivos archivo1 y archivo2 y excluye a archivo3
zip -d comprimido.zip archivo1 archivo2... (-delete) Borra archivos y directorios de un archivo zip.
ATENCIÓN: NO borra los directorios si NO están vacíos
zip -e comprimido.zip archivo1 archivo2... (-encrypt) Comprime varios archivos en un archivo zip, pidiendo una contraseña para descomprimirlo
cat archivo (concatenate) Visualiza el contenido de un archivo sin la necesidad de abrir un editor
cat -n archivo (-number) Visualiza el contenido de un archivo mostrando los números de línea
cat > archivo Crea un archivo nuevo e inmediatamente permite escribir su código
cat archivo1 archivo2 > archivo3 Concatena dos archivos y lo guarda como un archivo nuevo
tac archivo (cat invertido) Muestra el contenido del archivo pero invertido, imprimiendo desde la última línea hasta la primera

[1] Si ya existen archivos con el mismo nombre, se sobreescribirán.

Filtros

Afortunadamente, la consola cuenta con varios comandos nativos para filtrar el contenido de los archivos:

Comando Descripción
wc -w (word count -words) Muestra la cantidad de palabras en el archivo
wc -l (-lines) Muestra la cantidad de líneas del archivo
wc -m Muestra la cantidad de caracteres en el archivo
head archivo Muestra las primeras 10 líneas de un archivo
head -n número archivo Muestra las primeras líneas de un archivo, desde la primera hasta la cantidad indicada
tail archivo Muestra las últimas 10 líneas de un archivo
tail -n +número archivo Muestra las últimas líneas de un archivo, desde la cantidad indicada hasta el final
sort archivo Ordena alfabéticamente las líneas del archivo
nl archivo (number lines) Muestra el archivo con las líneas numeradas
nl -w número archivo Muestra el archivo con las líneas numeradas. La opción -w indica la cantidad de espacios de indentación
nl -s cadena archivo Muestra el archivo con las líneas numeradas. La opción -s (-string) señala una cadena de texto que se imprimirá luego del número. Por ejemplo, con -s ' - ' se mostrará:
1 -
2 -
...

Operadores de redirección

Los operadores de redirección permiten enviar la salida de un comando a un archivo, o bien leer desde un archivo como entrada para un comando.

Operador Descripción
comando > archivo Toma la salida del comando y lo guarda en un archivo
comando >> archivo Añade la salida del comando al final del archivo
comando < archivo Lee el contenido del archivo y lo utiliza como entrada para el comando

Operador >

El operador "mayor que" (>) envía la salida de un comando a un archivo. Por ejemplo:

ls -1 > lista.txt     # Guarda la lista de archivos y directorios actuales en un archivo de texto

Operador >>

El operador >> agrega la salida del comando al final del archivo, sin borrar el contenido anterior.

echo "Esta es una línea nueva" >> lista.txt     # Agrega una nueva línea al final del archivo de texto

Operador <

Al contrario que >, el operador "menor que" (<) lee el contenido de un archivo para un comando. La diferencia con | radica en que éste conecta dos comandos entre sí, mientras que el operador < conecta un archivo directamente a un comando.

wc -m < lista.txt     # Cuenta la cantidad de caracteres en un archivo de texto

Truncar, extender y dividir archivos

Existen dos comandos útiles para manipular el tamaño de los archivos: truncate y split.

Comando Descripción
truncate -s tamaño archivo (-size) Recorta o extiende un archivo a un cierto tamaño
split -b tamaño archivo prefijo (-bytes) Divide un archivo en varias partes según un tamaño dado
split -n número archivo prefijo (-number) Divide un archivo en cierto número de partes

truncate

Este comando nos permite tanto truncar como extender un archivo según su tamaño actual. Por defecto, el tamaño está indicado bytes, pero también se puede especificar en kilobytes con el sufijo K, en megabytes con M, en gigabytes con G, etc.

truncate -b 100K archivo.txt     # Extiende el archivo a 100 kilobytes (si su tamaño es menor) 

split

El comando split divide un archivo en varias partes. La opción -b indica el tamaño de cada parte, mientras que la opción -n indica la cantidad de partes en que se dividirá el archivo. Por defecto, los archivos resultantes se nombran con una secuencia de letras (aa, ab, ac...), pero se pueden utilizar números con la opción -d.

split -b 250K archivo.txt fragmento-      # Divide el archivo en partes de 250 kilobytes. Los nombres de las partes serán "fragmento-aa", "fragmento-ab", etc.
split -b 2M -d archivo.txt parte_         # Divide el archivo en partes de 2 megabytes. Los nombres de las partes serán "parte_00", "parte_01", etc.
split -n 6 archivo.txt parte_             # Divide el archivo en 6 partes iguales

Ejercicios

  1. Crear dos directorios de nombres aulas y primer grado (así con espacio). Ingresar a este último y crear 4 directorios cuyos nombres sean alumno01, alumno02, alumno03 y alumno04 usando sufijos.
  2. Cambiar al directorio aulas y crear un archivo de nombre piso1.txt.
  3. Abrir ese archivo con un editor de texto y escribir lo que sigue:
    Recepción
    Sala 101
    Sala 102
    Sala 103
    Oficina de Dirección
    
  4. Buscar desde consola la expresión Oficina.
  5. Copiar el archivo y crear uno nuevo de nombre piso02.txt.
  6. En este archivo nuevo, escribir:
    Biblioteca
    Sala 201
    Sala 202
    Sala 203
    Sala 204
    
  7. Mostrar con file una breve descripción de este archivo.
  8. Copiar el archivo y pegarlo en el directorio superior.
  9. Renombrar el archivo a piso3.txt y moverlo al directorio primer grado.
  10. Sin cambiar de directorio, mover el archivo desde primer grado hacia aulas.
  11. Ingresar al directorio aulas y concatenar los archivos piso1.txt y piso2.txt en un nuevo archivo de nombre piso1y2.txt.
  12. Borrar este nuevo archivo.
  13. Subir un nivel y borrar aulas y primer grado pidiendo confirmación y aceptando todo.
  14. Crear un archivo de texto nuevo llamado alumnos.txt cuyo código sea:
    Patricia -> Tercer grado
    Úrsula -> Segundo grado
    Federico -> Tercer grado
    Carla -> Primer grado
    Walter -> Primer grado
    Lucio -> Segundo grado
    Graciela -> Tercer grado
    Diana -> Primer grado
    Zoe -> Segundo grado
    Ignacio -> Tercer grado
    Berta -> Primer grado
    Silvio -> Primer grado
    Julieta -> Primer grado
    Matías -> Segundo grado
    Esteban -> Segundo grado
    Osvaldo -> Tercer grado
    Tatiana -> Segundo grado
    Ramón -> Tercer grado
    Horacio -> Tercer grado
    Nancy -> Segundo grado
    Alfredo -> Primer grado
    Vicente -> Primer grado
    Katherine -> Tercer grado
    Yolanda -> Segundo grado
    
  15. Imprimir por terminal las primeras 7 líneas del archivo.
  16. Imprimir por terminal las últimas 11.
  17. Ordenar las líneas alfabéticamente.
  18. Crear un archivo de texto y extenderlo hasta un tamaño de 3 megabytes. Comprobar sus características con el comando stat y luego dividirlo en partes de 250 kilobytes cuyo prefijo será fragmento_.
  19. Crear otro archivo, extenderlo hasta un tamaño de 7 megabytes y dividirlo en 5 partes iguales con el prefijo parte- seguido de un número.