Comandos básicos de Linux — ejercicios con rutas, comodines, una entrega de IC2 y una carpeta en caos (y el espacio que se llevó mis archivos .c)

Un viernes por la tarde quise limpiar los temporales de mi carpeta de prácticas antes de subirla. Escribí rm *.tmp… o eso creía. Se me coló un espacio entre el asterisco y .tmp, pulsé Intro y la terminal solo dijo que no encontraba .tmp. Cuando hice ls, no quedaba nada: ni los temporales ni mis archivos .c. Un solo espacio. Lo vas a ver en directo en «¿Qué falla aquí?», con la salida real, y vas a entender por qué rm ni se enteró de que había un comodín.

Estos son los ejercicios de comandos básicos de Linux con solución, el cierre del tema después de la teoría y la práctica. Son cuatro ejercicios en tres niveles (rutas, comodines, la entrega de una práctica y una carpeta en caos), tres fragmentos con trampa, las soluciones comentadas con su salida real y un chuletario para tener a mano en el laboratorio.

Cómo usar este artículo

  1. Abre la terminal de Fedora y, para cada ejercicio, copia primero el bloque de preparación: crea las carpetas y archivos con los que vas a trabajar.
  2. Intenta resolverlo solo. Si llevas más de diez minutos atascado, abre la pista .
  3. Antes de mirar la solución, haz los fragmentos de «¿Qué falla aquí?»: predice qué sale y luego compruébalo.
  4. Compara con las soluciones comentadas. No hay una única respuesta buena: si tu orden hace lo mismo, vale.

Las salidas son reales, de una única ejecución con el usuario sergio. En tu ordenador saldrán tu usuario y tu fecha; si tu Fedora está en español, los errores saldrán traducidos («No such file or directory» → «No existe el fichero o el directorio»). ls te pondrá los nombres en columnas; aquí salen uno por línea.

Antes de empezar: los comodines en Linux

Los comodines (wildcards) son caracteres especiales que representan uno o varios caracteres en nombres de archivo. Te ahorran escribir los archivos uno a uno:

ComodínSignificaEjemploEncaja con
*Cero o más caracteres cualesquiera*.cmain.c, practica1.c…
?Exactamente un carácterpractica?.cpractica1.c, pero no practica10.c
[abc]Uno de los caracteres de la lista[aeiou]*Lo que empieza por vocal
[a-z], [0-9]Uno del rango*[0-9]*Lo que tiene una cifra en el nombre

Y lo más importante, lo que explica casi todos los errores con comodines: los comodines los expande bash, no el comando. Cuando escribes ls *.c, bash busca qué archivos encajan, sustituye el patrón por la lista (ls main.c practica1.c) y solo entonces ejecuta ls. El comando nunca ve el asterisco. De ahí salen tres reglas:

  • Funcionan con cualquier orden que reciba nombres de archivo: ls, cp, mv, rm, cat…
  • Si el patrón no encaja con nada, bash lo deja tal cual y el comando recibe *.pdf literal (y se queja de que no existe).
  • * no encaja con los archivos ocultos: para esos, el patrón tiene que empezar por punto (.o*).

Usar un comodín con rm sin mirar antes qué expande. Primero ls *.tmp (o echo *.tmp); si la lista es la que esperas, cambia ls por rm.

Nivel básico

Ejercicio 1: encontrar archivos con rutas, sin moverte

Tienes un pequeño proyecto de C en tu carpeta personal. Prepáralo con esto:

mkdir -p proyecto/src/utils proyecto/src/tests proyecto/docs
touch proyecto/src/main.c proyecto/src/utils/helpers.c proyecto/src/utils/math.c
touch proyecto/src/tests/test1.c proyecto/docs/manual.txt
echo 'Proyecto de IC2' > proyecto/docs/readme.txt

Resuelve estas tareas sin usar cd, solo con rutas desde tu carpeta personal:

  1. Lista el contenido de proyecto/src/utils.
  2. Muestra el contenido de readme.txt.
  3. Copia helpers.c a proyecto/src/tests/ y comprueba que está.
  4. Lista todos los archivos .c del proyecto con una sola orden y comodines.
  5. ¿Cuántos .c hay en proyecto/src/utils?

Salida esperada: en el punto 2 tiene que salir Proyecto de IC2; en el punto 4, cinco archivos (contando la copia del punto 3); en el punto 5, dos.

cat y cp aceptan rutas igual que ls. Para el punto 4, un * solo cubre un nivel de carpeta: proyecto/src/*/*.c encuentra lo que hay en utils y tests, pero no main.c, que está un nivel más arriba.

Ejercicio 2: comodines en acción

Ahora una carpeta con archivos de todos los tipos. Prepárala:

mkdir comodines
cd comodines
touch archivo1.txt archivo2.txt archivo3.txt datos1.csv datos2.csv datos3.csv
touch script1.sh script2.sh imagen.png foto.jpg video.mp4 .oculto1 .oculto2
ls -a

La última orden de la preparación te enseña lo que hay, ocultos incluidos:

$ mkdir comodines
$ cd comodines
$ touch archivo1.txt archivo2.txt archivo3.txt datos1.csv datos2.csv datos3.csv
$ touch script1.sh script2.sh imagen.png foto.jpg video.mp4 .oculto1 .oculto2
$ ls -a
.
..
.oculto1
.oculto2
archivo1.txt
archivo2.txt
archivo3.txt
datos1.csv
datos2.csv
datos3.csv
foto.jpg
imagen.png
script1.sh
script2.sh
video.mp4

Resuelve con comodines:

  1. Lista solo los .txt.
  2. Lista los .txt y los .csv en una sola orden.
  3. Lista los que empiezan por datos.
  4. Lista los que tienen una cifra en el nombre.
  5. Lista los ocultos que empiezan por .o.
  6. Copia los archivos de texto (.txt y .csv) a una carpeta nueva textos.
  7. ¿Qué pasa con ls *.pdf? ¿Da error o no muestra nada?

Salida esperada: en el punto 4 salen nueve archivos (cuidado con video.mp4); en el 7, un error.

Se pueden poner varios patrones en la misma orden (ls *.txt *.csv). Para el punto 4, piensa que la cifra puede estar en cualquier sitio del nombre: necesitas un * a cada lado de [0-9].

Nivel intermedio

Ejercicio 3: prepara la entrega de la práctica 2

Es domingo por la noche y toca entregar la práctica 2 de IC2. Tienes esto:

mkdir -p IC2/Practicas/P2/pruebas IC2/Entregas
cd IC2/Practicas/P2
touch main.c funciones.c funciones.h notas.txt borrador.c
ls

La salida real:

$ mkdir -p IC2/Practicas/P2/pruebas IC2/Entregas
$ cd IC2/Practicas/P2
$ touch main.c funciones.c funciones.h notas.txt borrador.c
$ ls
borrador.c
funciones.c
funciones.h
main.c
notas.txt
pruebas

Desde dentro de P2, haz la entrega:

  1. Una copia de seguridad de toda la práctica en Practicas/P2_copia, por si acaso.
  2. Renombra main.c a p2_medina.c (la profesora pide el apellido en el nombre; pon el tuyo).
  3. Copia a IC2/Entregas solo lo que se entrega: p2_medina.c, funciones.c y funciones.h.
  4. Borra borrador.c con confirmación.
  5. Quita la carpeta pruebas, que está vacía.
  6. Comprueba cómo quedan P2, Entregas y la copia.

Salida esperada: Entregas con tres archivos; P2 con funciones.c, funciones.h, notas.txt y p2_medina.c; y la copia, intacta, con el main.c original.

Desde IC2/Practicas/P2, Entregas está dos niveles arriba: ../../Entregas/. cp acepta varios orígenes y un destino al final, que tiene que ser una carpeta.

Desafío final

Ejercicio 4: organiza el caos

Una carpeta caos con todo mezclado, como la de cualquiera a mitad de cuatrimestre. Créala:

mkdir caos
cd caos
touch practica1.c practica2.c practica3.c examen_final.c examen_parcial.c
touch apuntes_linux.txt apuntes_c.txt apuntes_python.txt foto_clase.jpg foto_lab.jpg
touch borrar_esto.tmp basura.tmp cache.tmp
echo 'int main(void) { return 0; }' > practica1.c
ls

Lo que enseña la terminal:

$ mkdir caos
$ cd caos
$ touch practica1.c practica2.c practica3.c examen_final.c examen_parcial.c
$ touch apuntes_linux.txt apuntes_c.txt apuntes_python.txt foto_clase.jpg foto_lab.jpg
$ touch borrar_esto.tmp basura.tmp cache.tmp
$ echo 'int main(void) { return 0; }' > practica1.c
$ ls
apuntes_c.txt
apuntes_linux.txt
apuntes_python.txt
basura.tmp
borrar_esto.tmp
cache.tmp
examen_final.c
examen_parcial.c
foto_clase.jpg
foto_lab.jpg
practica1.c
practica2.c
practica3.c

Tu objetivo es que quede así:

caos/
├── codigo/
│   ├── practicas/   ← los practica*.c
│   └── examenes/    ← los examen*.c
├── apuntes/         ← los apuntes*.txt
├── multimedia/      ← las fotos .jpg
└── (los .tmp, borrados)

Reglas:

  • Nada de mover archivo a archivo: un comodín por grupo.
  • Los .tmp se borran con confirmación, y antes compruebas cuáles son.
  • Al final, una sola orden que enseñe toda la estructura.
  • Diez órdenes como máximo.

mkdir -p crea las cinco carpetas de una vez (codigo incluida). Con mv practica*.c codigo/practicas/ mueves las tres prácticas en una orden. Y ls -R enseña el árbol completo desde donde estás.

¿Qué falla aquí?

Tres fragmentos cortos que parecen correctos. Lee cada uno, predice qué va a salir y solo entonces mira la salida real.

Fragmento 1: limpiar los temporales

En la carpeta limpieza hay dos archivos de código y dos temporales. Quiero borrar los temporales:

ls
rm * .tmp
ls

¿Qué queda en la carpeta? Piénsalo antes de seguir.

$ ls
basura.tmp
cache.tmp
main.c
notas.txt
$ rm * .tmp
rm: cannot remove '.tmp': No such file or directory
$ ls

No queda nada. El espacio entre * y .tmp convierte un patrón en dos argumentos: * (que bash expande a todos los archivos) y .tmp (un nombre que no existe). rm recibe cinco nombres, borra los cuatro que existen y solo se queja del quinto. El mensaje de error te hace pensar que no ha pasado nada, cuando ha pasado todo.

La expansión de rm * .tmpCon un espacio, rm * .tmp recibe los cuatro archivos más .tmp; sin espacio, rm *.tmp recibe solo los dos .tmp.Los comodines los expande bash, no rmEn la carpeta hay: basura.tmp cache.tmp main.c notas.txtescribesrm * .tmprm recibebasura.tmpcache.tmpmain.cnotas.txt.tmp* = TODO; .tmp va aparte y no existe → borra los 4escribesrm *.tmprm recibebasura.tmpcache.tmp*.tmp = solo lo que acaba en .tmp
Un solo espacio convierte «borra los temporales» en «borra todo»: rm ni se entera de que había un comodín.

Leer el error de rm como «no ha borrado nada». rm procesa sus argumentos uno a uno: un error con uno no impide borrar los demás.

El arreglo: sin espacio, y mirando antes con ls:

ls *.tmp
rm *.tmp
ls

Al ejecutarlo:

$ ls *.tmp
basura.tmp
cache.tmp
$ rm *.tmp
$ ls
main.c
notas.txt

Antes de un rm con comodines, escribe la misma orden con echo delante: echo rm * .tmp te enseña exactamente lo que rm va a recibir, sin borrar nada.

Fragmento 2: la copia de seguridad que no copió

Quiero una copia de seguridad de toda la carpeta Practicas antes de tocar nada:

cp Practicas Practicas_copia
ls

¿Tienes copia? Predice y mira:

$ cp Practicas Practicas_copia
cp: -r not specified; omitting directory 'Practicas'
$ ls
Practicas

No hay copia: ls solo enseña Practicas. cp sin -r se salta las carpetas: escribe un aviso («omitting directory») y sigue como si nada. Si no lees el mensaje, crees que tienes copia de seguridad y no la tienes.

Confiar en que no ha salido nada en rojo. En la terminal no hay colores que avisen: hay que leer cada línea que escribe la orden.

Con -r (recursive) cp entra en la carpeta y copia todo lo que hay dentro:

cp -r Practicas Practicas_copia
ls -R Practicas_copia

Resultado:

$ cp -r Practicas Practicas_copia
$ ls -R Practicas_copia
Practicas_copia:
P1

Practicas_copia/P1:
hola.c

ls -R de la copia es la comprobación rápida: si aparece hola.c dentro de P1, la copia está completa.

Fragmento 3: la carpeta con espacio

Quiero una carpeta llamada «Mis practicas» y entrar en ella:

mkdir Mis practicas
ls
cd Mis practicas

¿Cuántas carpetas se crean? ¿Puedo entrar?

$ mkdir Mis practicas
$ ls
Descargas
Documentos
Escritorio
Mis
practicas
$ cd Mis practicas
bash: cd: too many arguments

Se crean dos carpetas, Mis y practicas, porque el espacio separa argumentos y mkdir recibe dos nombres. Y cd Mis practicas falla con «too many arguments»: cd solo admite un destino y le han llegado dos.

Usar espacios en nombres de archivos y carpetas en Linux. Funcionan, pero te obligan a poner comillas en todas las órdenes.

El arreglo: comillas (o, mejor todavía, un guion bajo: Mis_practicas):

mkdir "Mis practicas"
ls
cd "Mis practicas"
pwd

Y esto es lo que sale de verdad:

$ mkdir "Mis practicas"
$ ls
Descargas
Documentos
Escritorio
Mis practicas
$ cd "Mis practicas"
$ pwd
/home/sergio/Mis practicas

Si pulsas Tab después de cd Mis, bash completa el nombre con la barra invertida que hace falta: cd Mis\ practicas. La barra le dice que ese espacio forma parte del nombre.

Soluciones comentadas

Solución del ejercicio 1

# 1. contenido de utils sin moverme de mi carpeta
ls proyecto/src/utils
# 2. ver readme.txt: cat acepta rutas igual que ls
cat proyecto/docs/readme.txt
# 3. copiar helpers.c a tests (destino = carpeta que existe)
cp proyecto/src/utils/helpers.c proyecto/src/tests/
ls proyecto/src/tests
# 4. todos los .c: un * por cada nivel de carpeta
ls proyecto/src/*.c proyecto/src/*/*.c
# ** en bash NO baja a todos los niveles: vale lo mismo que *
ls proyecto/**/*.c
# 5. cuántos .c hay en utils
ls proyecto/src/utils/*.c

La salida real:

$ ls proyecto/src/utils
helpers.c
math.c
$ cat proyecto/docs/readme.txt
Proyecto de IC2
$ cp proyecto/src/utils/helpers.c proyecto/src/tests/
$ ls proyecto/src/tests
helpers.c
test1.c
$ ls proyecto/src/*.c proyecto/src/*/*.c
proyecto/src/main.c
proyecto/src/tests/helpers.c
proyecto/src/tests/test1.c
proyecto/src/utils/helpers.c
proyecto/src/utils/math.c
$ ls proyecto/**/*.c
proyecto/src/main.c
$ ls proyecto/src/utils/*.c
proyecto/src/utils/helpers.c
proyecto/src/utils/math.c

Por qué está hecho así:

  • Rutas en lugar de cd. Todas las órdenes aceptan una ruta relativa desde donde estás. Es más rápido y no te arriesgas a perderte.
  • cp ... proyecto/src/tests/ copia dentro porque tests es una carpeta que existe. ls proyecto/src/tests lo confirma: ahora hay dos archivos.
  • Dos patrones para todos los .c. proyecto/src/*.c encuentra main.c y proyecto/src/*/*.c los cuatro de las subcarpetas: 1 + 4 = 5.
  • ** no es recursivo por defecto. En bash, proyecto/**/*.c vale lo mismo que proyecto/*/*.c: un solo nivel. Por eso solo encuentra proyecto/src/main.c. Para que baje a todos los niveles hay que activar shopt -s globstar, que no viene activado.
  • Contar con la vista. ls proyecto/src/utils/*.c da dos líneas: dos archivos. Cuando veas tuberías, ls ... | wc -l lo contará por ti.
PatrónNiveles que miraEncuentra
proyecto/src/*.cSolo srcmain.c
proyecto/src/*/*.cUn nivel por debajo de srchelpers.c (×2), test1.c, math.c
proyecto/**/*.cUno por debajo de proyecto (sin globstar)main.c

Solución del ejercicio 2

# 1. solo los .txt
ls *.txt
# 2. .txt y .csv en una sola orden: dos patrones
ls *.txt *.csv
# 3. los que empiezan por datos
ls datos*
# 4. los que tienen una cifra en cualquier parte del nombre
ls *[0-9]*
# 5. los ocultos que empiezan por .o (el patrón ya lleva el punto)
ls -d .o*
# 6. copiar los de texto a una carpeta nueva
mkdir textos
cp *.txt *.csv textos/
ls textos
# 7. un patrón que no encaja con nada llega tal cual a ls
ls *.pdf

La salida real:

$ ls *.txt
archivo1.txt
archivo2.txt
archivo3.txt
$ ls *.txt *.csv
archivo1.txt
archivo2.txt
archivo3.txt
datos1.csv
datos2.csv
datos3.csv
$ ls datos*
datos1.csv
datos2.csv
datos3.csv
$ ls *[0-9]*
archivo1.txt
archivo2.txt
archivo3.txt
datos1.csv
datos2.csv
datos3.csv
script1.sh
script2.sh
video.mp4
$ ls -d .o*
.oculto1
.oculto2
$ mkdir textos
$ cp *.txt *.csv textos/
$ ls textos
archivo1.txt
archivo2.txt
archivo3.txt
datos1.csv
datos2.csv
datos3.csv
$ ls *.pdf
ls: cannot access '*.pdf': No such file or directory

Por qué está hecho así:

  • ls *.txt *.csv: dos patrones, cada uno se expande por separado y ls recibe seis nombres.
  • *[0-9]* encuentra nueve, no ocho. video.mp4 tiene un 4 en la extensión y el patrón mira todo el nombre. Cuenta: tres archivo, tres datos, dos script y video.mp4 = 9.
  • ls -d .o*: el patrón ya empieza por punto, así que encaja con los ocultos sin necesidad de -a. La -d evita que ls intente entrar en ellos si fueran carpetas.
  • cp *.txt *.csv textos/: varios orígenes y un destino que es carpeta. Creamos textos antes porque cp no crea carpetas.
  • ls *.pdf da error. No hay ningún .pdf, así que bash no expande nada y ls recibe el texto *.pdf tal cual. Busca un archivo que se llama literalmente *.pdf y no lo encuentra.

ls *.{txt,csv} también funciona, pero las llaves no son un comodín: bash las convierte en *.txt *.csv antes de buscar archivos. Si te lías, usa los dos patrones separados.

Solución del ejercicio 3

# 1. copia de seguridad de toda la práctica (carpeta: hace falta -r)
cp -r ../P2 ../P2_copia
ls ..
# 2. renombrar main.c con mi apellido
mv main.c p2_medina.c
# 3. copiar a Entregas solo lo que se entrega: varias fuentes, un destino
cp p2_medina.c funciones.c funciones.h ../../Entregas/
ls ../../Entregas
# 4. borrar el borrador preguntando
rm -i borrador.c
# 5. quitar la carpeta pruebas, que está vacía
rmdir pruebas
# 6. comprobar cómo queda
ls
ls ../P2_copia

Lo que enseña la terminal:

$ cp -r ../P2 ../P2_copia
$ ls ..
P2
P2_copia
$ mv main.c p2_medina.c
$ cp p2_medina.c funciones.c funciones.h ../../Entregas/
$ ls ../../Entregas
funciones.c
funciones.h
p2_medina.c
$ rm -i borrador.c
rm: remove regular empty file 'borrador.c'? y
$ rmdir pruebas
$ ls
funciones.c
funciones.h
notas.txt
p2_medina.c
$ ls ../P2_copia
borrador.c
funciones.c
funciones.h
main.c
notas.txt
pruebas

Por qué está hecho así:

  • La copia de seguridad va primero. Si algo sale mal en los pasos siguientes, P2_copia conserva la práctica tal como estaba, con main.c y borrador.c incluidos (lo confirma el último ls).
  • cp -r ../P2 ../P2_copia: desde dentro de P2, la carpeta se nombra como ../P2. La copia queda como hermana, en Practicas.
  • mv para renombrar porque el archivo no tiene que estar dos veces: solo cambia su nombre.
  • Un cp con tres orígenes. El último argumento (../../Entregas/) es el destino; todo lo anterior se copia dentro. notas.txt no se entrega, por eso no está.
  • rm -i y rmdir. Son las dos órdenes de borrar «con red»: rm -i pregunta y rmdir solo funciona si la carpeta está vacía.
PasoOrdenDónde queda cada cosa
1cp -r ../P2 ../P2_copiaCopia completa (6 elementos) en P2_copia
2mv main.c p2_medina.cEn P2, main.c pasa a llamarse p2_medina.c
3cp ... ../../Entregas/Entregas: 3 archivos
4rm -i borrador.cFuera de P2 (sigue en la copia)
5rmdir pruebasFuera de P2 (sigue en la copia)

Solución del ejercicio 4

# 1. toda la estructura de una vez
mkdir -p codigo/practicas codigo/examenes apuntes multimedia
# 2-5. un comodín por grupo de archivos
mv practica*.c codigo/practicas/
mv examen*.c codigo/examenes/
mv apuntes*.txt apuntes/
mv *.jpg multimedia/
# 6. revisar antes de borrar y borrar preguntando uno a uno
ls *.tmp
rm -i *.tmp
# 7. el resultado completo
ls -R

Al ejecutarlo:

$ mkdir -p codigo/practicas codigo/examenes apuntes multimedia
$ mv practica*.c codigo/practicas/
$ mv examen*.c codigo/examenes/
$ mv apuntes*.txt apuntes/
$ mv *.jpg multimedia/
$ ls *.tmp
basura.tmp
borrar_esto.tmp
cache.tmp
$ rm -i *.tmp
rm: remove regular empty file 'basura.tmp'? y
rm: remove regular empty file 'borrar_esto.tmp'? y
rm: remove regular empty file 'cache.tmp'? y
$ ls -R
.:
apuntes
codigo
multimedia

./apuntes:
apuntes_c.txt
apuntes_linux.txt
apuntes_python.txt

./codigo:
examenes
practicas

./codigo/examenes:
examen_final.c
examen_parcial.c

./codigo/practicas:
practica1.c
practica2.c
practica3.c

./multimedia:
foto_clase.jpg
foto_lab.jpg

Son nueve órdenes, una menos que el máximo. Así quedan los trece archivos:

Organiza el caos: antes y despuésA la izquierda los 13 archivos mezclados de caos; a la derecha, a dónde va cada grupo con su mv y los tres .tmp borrados con rm -i.Antes y después de «Organiza el caos»caos/apuntes_c.txtapuntes_linux.txtapuntes_python.txtbasura.tmpborrar_esto.tmpcache.tmpexamen_final.cexamen_parcial.cfoto_clase.jpgfoto_lab.jpgpractica1.cpractica2.cpractica3.ccodigo/practicas/mv practica*.cpractica1.cpractica2.cpractica3.ccodigo/examenes/mv examen*.cexamen_final.cexamen_parcial.capuntes/mv apuntes*.txtapuntes_c.txtapuntes_linux.txtapuntes_python.txtmultimedia/mv *.jpgfoto_clase.jpgfoto_lab.jpgrm -i *.tmpborradosbasura.tmpborrar_esto.tmpcache.tmp
Cinco órdenes con comodín hacen el trabajo de trece mv sueltos.

Por qué está hecho así:

  • mkdir -p con cuatro rutas crea cinco carpetas: codigo aparece sola porque -p crea las intermedias.
  • Un comodín por grupo. practica*.c encaja con las tres prácticas y examen*.c con los dos exámenes. Ojo con *.c a secas: se habría llevado las prácticas y los exámenes a la misma carpeta.
  • ls *.tmp antes de rm -i *.tmp. Es la regla del fragmento 1: mirar lo que expande el patrón antes de borrar. rm -i pregunta tres veces, una por archivo, y se contesta y a las tres.
  • ls -R sin argumentos recorre la carpeta actual (.) y todas sus subcarpetas: es la «foto final» que pedía el enunciado.
OrdenArchivos que mueve o borraQuedan sueltos en caos
(inicio)—13
mv practica*.c codigo/practicas/310
mv examen*.c codigo/examenes/28
mv apuntes*.txt apuntes/35
mv *.jpg multimedia/23
rm -i *.tmp30

Cuenta comprobada: 3 + 2 + 3 + 2 + 3 = 13.

Pruébalo en tu terminal

En Linux no hay Python Tutor, pero sí un truco para «ver» lo que hace bash antes de ejecutar nada: echo. Repite el fragmento 1 sin borrar nada (con la carpeta limpieza recién creada):

echo *.tmp
echo * .tmp
echo rm * .tmp

Lo que deberías ver:

$ echo *.tmp
basura.tmp cache.tmp
$ echo * .tmp
basura.tmp cache.tmp main.c notas.txt .tmp
$ echo rm * .tmp
rm basura.tmp cache.tmp main.c notas.txt .tmp

Qué observar:

  1. echo *.tmp enseña los dos archivos que encajan: es lo que recibiría rm *.tmp.
  2. echo * .tmp enseña los cuatro archivos más .tmp suelto al final: el espacio ha partido el patrón en dos.
  3. echo rm * .tmp escribe la orden completa tal como la ejecutaría bash. Es la prueba del delito.
  4. Ninguna de las tres órdenes ha borrado nada: echo solo escribe. Haz esto cada vez que dudes de un comodín.

Chuletario: comandos básicos de Linux

Lo esencial en 30 segundos: pwd te dice dónde estás y ls qué hay. Una ruta con / delante empieza en la raíz; sin ella, en tu carpeta actual. cp duplica, mv mueve o renombra y rm borra sin papelera. Las carpetas necesitan -r para copiarse o borrarse con rm, y mkdir -p crea rutas enteras. Los comodines los expande bash: comprueba con ls o echo antes de borrar.

Quiero…CódigoResultado
Saber dónde estoypwd/home/sergio
Ver todo, ocultos incluidos, con detallesls -laUna línea por elemento
Ver un árbol enterols -R carpetaCada carpeta con su contenido
Subir un nivel / dos nivelescd .. / cd ../..La carpeta de arriba
Ir a casa / volver a la anteriorcd / cd -~ / la carpeta previa
Crear una ruta enteramkdir -p a/b/cLas tres carpetas
Quitar una carpeta vacíarmdir carpetaError si no está vacía
Crear un archivo vacíotouch archivo0 bytes
Ver un archivocat archivoSu contenido
Copiar dentro de una carpetacp archivo carpeta/Mismo nombre, otro sitio
Copiar una carpetacp -r origen copiaTodo el contenido
Renombrar / movermv viejo nuevo / mv archivo carpeta/El original desaparece
Borrar preguntandorm -i archivorm: remove ...?
Borrar una carpeta con todorm -r carpetaSin preguntar, sin papelera
Ruta absoluta de algorealpath archivo/home/sergio/...
Escribir / añadir una líneaecho 'x' > f / echo 'x' >> f> machaca, >> añade
ComodínEjemploEncaja con
*ls *.cTodos los .c (no los ocultos)
?ls practica?.cpractica1.c, no practica10.c
[0-9]ls *[0-9]*Lo que tiene una cifra
.o*ls -d .o*Ocultos que empiezan por .o

Plantillas de los ejercicios:

# Ejercicio 1: rutas sin moverse
ls proyecto/src/*.c proyecto/src/*/*.c      # todos los .c (5)
# Ejercicio 2: varios patrones, un destino
cp *.txt *.csv textos/
# Ejercicio 3: entrega
cp -r ../P2 ../P2_copia                     # primero, la copia
cp p2_medina.c funciones.c funciones.h ../../Entregas/
# Ejercicio 4: un comodín por grupo
mkdir -p codigo/practicas codigo/examenes apuntes multimedia
mv practica*.c codigo/practicas/
ls *.tmp && rm -i *.tmp                     # mirar antes de borrar
SíntomaCausa probable
No such file or directoryEstás en otra carpeta, sobra una / delante o hay una mayúscula mal
cp: -r not specified; omitting directoryCopiar una carpeta sin -r: no se ha copiado nada
rm: cannot remove 'x': Is a directoryrm sin -r sobre una carpeta (usa rmdir si está vacía)
rmdir: failed to remove 'x': Directory not emptyLa carpeta tiene algo: mira con ls antes de nada
mkdir: cannot create directory 'a/b'Falta la carpeta intermedia: usa mkdir -p
cd: too many argumentsUn nombre con espacios sin comillas
ls: cannot access '*.pdf'El comodín no encaja con ningún archivo
Ha desaparecido todo tras un rm con comodínUn espacio dentro del patrón (* .tmp)

Antes de entregar, pregúntate:

  1. ¿He hecho pwd antes de crear, mover o borrar?
  2. ¿He comprobado con ls (o echo) qué expande cada comodín antes de usarlo con rm?
  3. ¿He copiado las carpetas con -r y he leído los avisos de cp?
  4. ¿Tengo una copia de seguridad (o la carpeta compartida) antes de cualquier rm -r?

Con esto cierras los comandos básicos. El siguiente paso es Permisos en Linux: por qué /etc es de root, qué significa el rw-r--r-- de ls -l y cómo cambiarlo con chmod. Si te has saltado algo, vuelve a la teoría o a la práctica.

Sigue aprendiendoTodos los artículos de Linux

¿Te ha servido este artículo? Así puedes apoyar SergioLearns →

Sigue aprendiendo

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *