← Teoría P2 · UF0853 · Gestión de archivos en Linux ✓ Guardado

Práctica 2 · Gestión de archivos en Linux

UF: UF0853 · Sesión: 2 / 10 · Modalidad: individual
Entorno: VM Ubuntu (práctica 07) · No requiere hardware externo
Entregable: este archivo con capturas y respuestas, exportado como JSON o impreso a PDF

De qué va. La terminal de Linux es la herramienta más potente que vas a usar en tu carrera. Si dominas estos comandos, dominas el sistema. En esta sesión vas a manejar la terminal de Ubuntu: navegación, manipulación de archivos, comodines, redirección, tuberías, búsquedas con find y grep, compresión y edición.

Por qué importa. En un servidor real (web, base de datos, red) no hay escritorio gráfico. Solo terminal por SSH. Si no sabes moverte ahí, no puedes administrar nada.

Cómo se entrega. Pega capturas con Ctrl+V, arrastra o selecciona. Autosave en este navegador. ⬇ Exportar al terminar.

Antes de empezar: arranca la VM Ubuntu. Abre una terminal con Ctrl+Alt+T. Si no la tienes funcionando, vuelve a la práctica 07.

1 Anatomía del prompt y navegación

Diseccionar el prompt

Cuando abres una terminal, lo primero que ves es algo así:

juan@portatil:~$ 

Léelo de izquierda a derecha:

  • juan — tu usuario.
  • @ — separador.
  • portatil — el hostname (nombre del equipo).
  • : — separador.
  • ~ — directorio actual (la virgulilla = /home/juan).
  • $ — usuario normal. Si fuera #, serías root.
Comandos de orientación
whoami       # ¿quién soy?
hostname     # ¿en qué máquina estoy?
pwd          # ¿dónde estoy?
id           # UID, GID y grupos
date         # fecha y hora
uptime       # tiempo encendido y carga
uname -a     # kernel y arquitectura
ComandoTu salida
whoami
id (UID que aparece)
uname -a (versión del kernel)
uptime (carga media)
Pega (Ctrl+V), arrastra una imagen o haz clic para seleccionar

Navegación

cd /etc             # ir a /etc (absoluta)
pwd                 # confirma dónde estás
cd                  # sin argumento te lleva a ~
cd /var/log
cd -                # vuelve a la carpeta anterior
cd ../..            # sube dos niveles
cd ~juan            # va a la home de otro usuario (si existe)

Vas a usar dos comandos encadenados con && (significa «si el primero funciona, ejecuta el segundo»). El primero cambia de carpeta a /etc. El segundo lista lo que hay (ls) y pasa esa lista por una «tubería» | al comando wc -l, que cuenta líneas.

cd /etc && ls | wc -l

El número que te devuelve es la cantidad de archivos y carpetas que hay directamente dentro de /etc. Anótalo:

2 Listado, creación y manipulación

Variantes de ls

ls                  # simple
ls -l               # largo, con permisos, tamaño, fecha
ls -la              # incluye ocultos
ls -lh              # tamaños humanos (K, M, G)
ls -lhS             # ordenado por tamaño (S=size)
ls -lhrt            # más reciente al final (r reverse, t time)
ls -laR /etc/network # recursivo

Tu carpeta personal es /home/tu_usuario. Para ir ahí: cd ~ (la virgulilla es un atajo de tu home).

Ahora lista todo lo que hay, incluidos los ocultos (los que empiezan por punto). Para eso usa ls -la. Verás algo así:

total 124
drwxr-x---  18 juan juan  4096 may 26 10:00 .
drwxr-xr-x   3 root root  4096 may 20 09:00 ..
-rw-------   1 juan juan   220 may 20 09:00 .bash_history
-rw-r--r--   1 juan juan  3771 may 20 09:00 .bashrc
drwx------   3 juan juan  4096 may 21 11:00 .cache
...

Fíjate en 3 líneas «especiales» que NO son archivos tuyos: la primera (total 124) es solo un resumen, y las entradas . y .. son atajos al directorio actual y al padre (no son archivos reales).

Para contarlos de forma rápida:

ls -la ~ | wc -l

wc -l cuenta cuántas líneas tiene la salida. Réstale 3 (las 3 líneas especiales de arriba) y tendrás cuántos archivos/carpetas ocultos tienes realmente.

Reto de creación

Vas a crear esta estructura en ~/Reto_Linux:

~/Reto_Linux/
├── docs/
│   ├── 2024/
│   ├── 2025/
│   └── 2026/
├── scripts/
│   ├── activos/
│   └── archivados/
├── logs/
└── .config_oculto/
    └── settings.conf
Hazlo en UNA línea aprovechando llaves y -p
mkdir -p ~/Reto_Linux/{docs/{2024,2025,2026},scripts/{activos,archivados},logs,.config_oculto}
touch ~/Reto_Linux/.config_oculto/settings.conf
tree ~/Reto_Linux -a    # si no tienes tree: sudo apt install tree
Pega (Ctrl+V), arrastra una imagen o haz clic para seleccionar

Rellenar con archivos

cd ~/Reto_Linux

# crear varios archivos con touch
touch docs/2024/{enero,febrero,marzo}.txt
touch docs/2025/{enero,febrero,marzo,abril,mayo}.txt
touch docs/2026/{enero,febrero}.txt

# archivo con contenido usando echo y redirección
echo "Mi primer script" > scripts/activos/hola.sh
echo "echo Hola mundo" >> scripts/activos/hola.sh
cat scripts/activos/hola.sh

# varios archivos de log de relleno
for i in {1..10}; do echo "log $i" > logs/sistema_$i.log; done
ls -lh logs/

cp y mv

cp scripts/activos/hola.sh scripts/activos/hola_copia.sh
cp -r docs docs_backup   # carpetas necesitan -r
mv docs_backup docs_archivo   # renombrar
mv logs/sistema_1.log logs/old_1.log   # mover/renombrar archivo
ls logs/

Borrado

# un archivo
rm logs/old_1.log

# varios
rm logs/sistema_{8,9,10}.log

# carpeta entera (CUIDADO)
rm -r docs_archivo

# si quieres confirmación archivo por archivo
rm -i scripts/activos/hola_copia.sh
Cuidado mortal: rm -rf / borra todo el sistema. Sin papelera. Sin confirmación. Sin recuperación. Antes de teclear cualquier rm -rf, mira dos veces la ruta.

3 Comodines y expansión

ComodínSignificadoEjemplo
*Cualquier cantidad de caracteresls *.txt
?Un único carácterls foto?.jpg
[abc]Cualquiera de esosls foto[12].jpg
[a-z]Rangols *[0-9].txt
{a,b,c}Varias opcionesls *.{txt,md,log}
Experimentos en ~/Reto_Linux/docs
cd ~/Reto_Linux/docs/2025
ls *.txt                       # todos los .txt
ls ?nero.txt                   # un solo carácter al inicio
ls [ef]*.txt                   # empiezan por e o f
ls /etc/*.conf | head          # confs en /etc, primeros 10
ls /etc/{passwd,group,shadow}  # archivos concretos
Pega (Ctrl+V), arrastra una imagen o haz clic para seleccionar

4 Redirección y tuberías

SímboloQué hace
>Redirige salida a un archivo (sobrescribe)
>>Añade al final del archivo
<Lee la entrada desde un archivo
|Pasa la salida de un comando como entrada al siguiente
2>Redirige solo los errores
2>&1Funde errores con la salida normal
/dev/null«Agujero negro»: lo que se redirige ahí se descarta
Ejercicios
cd ~/Reto_Linux

# Listar /etc y guardar a archivo
ls /etc > lista_etc.txt
wc -l lista_etc.txt

# Añadir la fecha al final del archivo
date >> lista_etc.txt
tail lista_etc.txt

# Pipeline: contar archivos .conf en /etc
ls /etc | grep "\.conf$" | wc -l

# Top 5 procesos por uso de memoria
ps aux --sort=-%mem | head -6

# Errores van por separado: forzar uno y redirigirlo
ls /noexiste 2> errores.log
cat errores.log

# Descartar errores
find / -name "*.conf" 2> /dev/null | head

Vas a encadenar 3 comandos con tuberías:

  • du -sh ~/*/ mide el tamaño de cada carpeta de tu home (la s es «summary» y la h es «human» — tamaños en K/M/G).
  • sort -hr ordena por tamaño humano (h), de mayor a menor (r=reverse).
  • head se queda con las 10 primeras líneas.
du -sh ~/*/ | sort -hr | head

Ejecútalo y pega la salida (o anota las 3 más grandes):

Pega (Ctrl+V), arrastra una imagen o haz clic para seleccionar

5 Buscar archivos con find y texto con grep

find: el buscador todoterreno

# sintaxis: find <dónde> <criterio> <acción>

find /etc -name "*.conf"                   # por nombre
find /etc -iname "*RESOLV*"                # sin distinguir mayúsculas
find / -size +100M 2>/dev/null             # por tamaño > 100 MB
find ~ -mtime -1                           # modificados hace menos de 1 día
find ~ -mtime +30                          # modificados hace más de 30 días
find ~ -type f -name "*.log"               # solo archivos (no carpetas)
find ~ -type d -name "scripts"             # solo directorios
find ~/Reto_Linux -empty                   # vacíos

# find + acción: borrar todos los .tmp
find /tmp -name "*.tmp" -delete

# find + exec: ejecutar comando sobre cada resultado
find ~/Reto_Linux/logs -name "*.log" -exec wc -l {} \;

Combina find (busca por nombre en todas las subcarpetas) con wc -l (cuenta líneas):

find /etc -name "*.conf" | wc -l

Anota el número:

La opción -mtime -1 de find significa «modificado hace MENOS de 1 día». El signo menos es importante (sin él busca exactamente hace 1 día).

find ~ -mtime -1 -type f

Para contar cuántos son, añade | wc -l al final. Anota el comando exacto que usaste y el número:

grep: buscar dentro de archivos

grep "root" /etc/passwd                  # líneas con "root"
grep -i "INTERFACE" /etc/network/interfaces 2>/dev/null # sin mayúsculas
grep -n "bash" /etc/passwd               # con número de línea
grep -c "bash" /etc/passwd               # contar coincidencias
grep -v "#" /etc/ssh/sshd_config 2>/dev/null | grep -v "^$"  # sin comentarios ni vacías
grep -r "ubuntu" /etc 2>/dev/null         # recursivo
grep -E "^(root|nobody):" /etc/passwd     # regex extendida

El archivo /etc/passwd tiene una línea por cada usuario del sistema. La última columna (separada por :) es el shell que se abre al iniciar sesión. Si pone /bin/bash, es un usuario «normal» que puede usar la terminal. Si pone /usr/sbin/nologin o /bin/false, es una cuenta de sistema que no se usa para login.

Cuenta las líneas que contienen «bash»:

grep -c bash /etc/passwd

(La -c es «count», cuenta coincidencias.) Anota el número:

Son los que tienen /usr/sbin/nologin o /bin/false como shell. Para listarlos puedes usar grep con la opción -E (regex extendida) y el operador | dentro de las comillas (que aquí significa «o»):

grep -E "nologin|false" /etc/passwd

Pega aquí 3 ejemplos de cuentas de sistema que veas (la primera columna es el nombre):

Pega (Ctrl+V), arrastra una imagen o haz clic para seleccionar

6 Compresión: tar, gzip, zip

tar — el estándar en Linux

Memotécnico para las opciones más comunes:

LetraSignifica
cCreate (crear)
xeXtract (extraer)
tlisT (listar sin extraer)
vVerbose (ver qué hace)
fFile (siempre antes del nombre del archivo)
zgZip (comprime/descomprime con gzip)
jbzip2 (más compresión, más lento)
Jxz (todavía más compresión)
cd ~

# Crear tar.gz de Reto_Linux
tar -czvf reto.tar.gz Reto_Linux/

# Listar sin extraer
tar -tzvf reto.tar.gz | head

# Tamaño comparativo
du -sh Reto_Linux/ reto.tar.gz

# Probar bzip2 y xz
tar -cjvf reto.tar.bz2 Reto_Linux/
tar -cJvf reto.tar.xz Reto_Linux/
ls -lh reto.tar.*

# Extraer en otra carpeta
mkdir -p ~/Destino
tar -xzvf reto.tar.gz -C ~/Destino/
ls ~/Destino/
ArchivoTamaño
Reto_Linux/ (sin comprimir)
reto.tar.gz
reto.tar.bz2
reto.tar.xz

zip — compatible con Windows

sudo apt install -y zip unzip   # si no están
zip -r reto.zip Reto_Linux/
unzip -l reto.zip | head
unzip reto.zip -d ~/Destino_zip/
Pega (Ctrl+V), arrastra una imagen o haz clic para seleccionar

7 Editores en consola: nano y vim básico

nano — fácil

nano ~/Reto_Linux/notas.txt
# Escribe varias líneas
# Ctrl+O   guardar (write Out)
# Ctrl+X   salir
# Ctrl+K   cortar línea
# Ctrl+U   pegar
# Ctrl+W   buscar (Where)
# Ctrl+_   ir a número de línea

vim — el ninja

Vim tiene modos. Esa es la clave que confunde a todo el mundo al principio:

  • Modo normal (al entrar): teclas para moverte y dar órdenes. Aquí no escribes texto.
  • Modo insertar (pulsando i): aquí sí escribes texto, como en cualquier editor.
  • Modo comando (pulsando : desde normal): para guardar, salir, buscar.

Para volver a normal desde cualquier sitio: Esc.

Tour básico
vim ~/Reto_Linux/vim_tour.txt
# Pulsa i para entrar en modo insertar
# Escribe: "Hola desde vim"
# Pulsa Esc
# Escribe :w para guardar
# Escribe :q para salir
# O en una sola: :wq
# Si quieres salir sin guardar: :q!
Por qué aprender vim al menos un poco. En servidores remotos por SSH muchas veces solo tienes vim. Es el único editor garantizado en cualquier Unix. Aprende como mínimo i, Esc, :wq y :q!: con eso ya no te quedas «atrapado».

8 Reto final · Pipeline real

Escenario. Tienes que generar un informe sobre el sistema, comprimirlo y dejarlo listo para entregar. Vas a usar todo lo aprendido en una sola sesión.
Tarea 1 · Genera 50 archivos de log de relleno
cd ~/Reto_Linux/logs
for i in $(seq 1 50); do
  echo "$(date) - evento $i" > "log_$(printf '%03d' $i).log"
done
ls -la | head
Tarea 2 · Hazlos «antiguos» modificando fechas
# Los 25 primeros con fecha de hace 60 días
for i in $(seq 1 25); do
  touch -d "60 days ago" "log_$(printf '%03d' $i).log"
done
ls -lt | head -30
Tarea 3 · Borra los antiguos automáticamente con find
find . -name "log_*.log" -mtime +30 -delete
ls | wc -l   # ¿cuántos quedan?
Tarea 4 · Construye un informe del sistema
cd ~/Reto_Linux

{
  echo "=== INFORME DEL SISTEMA ==="
  echo "Fecha: $(date)"
  echo "Usuario: $(whoami)"
  echo "Hostname: $(hostname)"
  echo ""
  echo "=== KERNEL ==="
  uname -a
  echo ""
  echo "=== MEMORIA ==="
  free -h
  echo ""
  echo "=== DISCO ==="
  df -h /
  echo ""
  echo "=== TOP 5 PROCESOS POR RAM ==="
  ps aux --sort=-%mem | head -6
  echo ""
  echo "=== ARCHIVOS DE LOG RESTANTES ==="
  ls logs/ | wc -l
} > informe_$(date +%Y%m%d).txt

cat informe_*.txt
Tarea 5 · Comprime y deja todo listo
tar -czvf entrega_$(whoami)_$(date +%Y%m%d).tar.gz \
  Reto_Linux/informe_*.txt \
  Reto_Linux/logs/ \
  Reto_Linux/scripts/

ls -lh entrega_*.tar.gz
Pega (Ctrl+V), arrastra una imagen o haz clic para seleccionar

✓ Autoevaluación final

Marca lo que has completado.

Progreso0%