Programa a realizar interactivamente

A continuación vas a pasar a un ejercicio para realizar una macro con ayuda del ordenador. El sistema te irá guiando paso a paso en lo que debes hacer, preguntándote cada paso concreto, salvo aquellos que parecen obvios, por ser de temas anteriores. Si te equivocas te dará pistas explícitas.

Tienes que ir haciendo la macro en el editor: no va a aparecer toda junta escrita, ni lo va a estar si tú no la escribes; entonces vete abriendo el editor y vas rellenando al ir contestando a las preguntas del sistema te diga.

Recuerda que, en algunos sistemas, puedes copiar desde el navegador y pegar en el editor cuando te sea cómodo.

A veces el sistema va tomando nota de tus respuestas, para ver si son coherentes con las siguientes. Si tienes que cortar y cierras sin más, tendrías que volver a empezar de cero la próxima vez. Para evitar eso, hay un botón que dice 'Parar' Púlsalo y guardará una cookie con los datos de por donde vas. Para continuar en otra ocasión, tendrás que usar el mismo navegador en el mismo equipo.

Cuando tengas el editor preparado, empieza viendo el enunciado.

Lo que se pide es una macro que reciba los nombres de dos ficheros y los intercambie. Por ejemplo, si la llamada es:

./macro.sh casa portal

Entonces, tras la llamada, el fichero casa se llamará portal y el fichero que antes era portal, ahora se llamará casa. Asegúrate que entiendes el enunciado antes de continuar. Pregunta al profesor si no lo ves claro.

¿Entendido?, pues

Empezamos preparando la primera línea de la macro, con #!/bin/bash, y los comentarios que creas oportunos. Vamos con los comandos.

No podemos directamente cambiar de nombre al primero y ponerle el de segundo (ni lo contrario) porque nos va a decir que ese nombre ya existe: no puede haber dos ficheros con el mismo nombre en el mismo directorio. La estrategia que vamos a usar es cambiar de nombre al primer fichero por otro arbitrario, para a continuación pasar su antiguo nombre al otro fichero. Entonces nos aparecen tres comandos: dos para cambiar al primer fichero de nombre, pasando por el arbitrario y uno para cambiar al segundo.

Vamos a ver cómo organizamos la macro

Plantilla a poner
...
comando A
comando B
comando C

...

El intérprete de comandos no los mira todos y decide el orden, sino que lo ejecuta directamente por el orden que lee, sin pensar Así que éste comando se hará lo primero.
Cuando esté hecho el primero, sea lo que sea lo que haya pasado, hará éste el segundo, y así sucesivamente los demás
Por ejemplo, si queremos pasar todos los ficheros de este directorio a otro, dejando una lista de ellos en otro fichero, podríamos organizar la macro:
comando para pasar todo el contenido de este directorio a otro

comando para listar el contenido de este directorio en otro fichero

O, al revés:
comando para listar el contenido de este directorio en otro fichero

comando para pasar todo el contenido de este directorio a otro

El primer caso es un desastre, porque cuando va a listar el contenido del directorio ya no queda nada en él. El segundo es el orden perfecto.
Por ejemplo, si queremos meter en un directorio un archivo comprimido con una serie de imágenes en cierto formato, podríamos organizar la macro:
comando para cambiar el comprimido de directorio

comando para meter las imágenes en el comprimido

comando para cambiar de formato las imágenes

Por ejemplo, si queremos borrar todos los archivos que no sean ni mp3 ni wav, porque a esos los vamos a salvar en otros directorios, organizaremos la macro:
comando para pasar los mp3 a su directorio

comando para pasar los wav al suyo

comando para borrar todo lo que quede

Mal: El primer comando nos fallará porque el archivo comprimido todavía no existe (se crea con el segundo)
Bien También podían haberse cambiado los wav primero, porque el primer comando y el segundo no se afectan el uno al otro
De momento vamos a llamar a los comandos que queremos hacer 1->aux aux->2 2->1

Ponlos a continuación por el orden que hay que ejecutarlos, separados por espacios:

1->aux 2->1 aux->2
1->aux aux->2 2->1
2->1 1->aux aux->2
No, en el segundo paso te dará error porque el nombre del 2 está ocupado: no lo desocupas hasta el tercer paso.
No, en el primer paso te dará error porque el nombre del 1 está ocupado: no lo desocupas hasta el segundo paso.
Como nombre arbitrario vamos a usar jkfdshre Por supuesto, puede usarse cualquiera que sepas que no va a existir. (Fallaría si ese nombre absurdo existiese; si quieres saber más de lo que se pide en el curso para resolver esto de forma definitiva, pulsa aquí)

El comando para cambiar el nombre de un fichero es mv

Vamos a ver cómo usamos un comando con uno de los datos que se le pasan a la macro

Plantilla a poner
comando... $...
Donde haya que poner el valor se empieza poniendo un $
Después se pone el número del dato en la llamada a la macro (1 si es el primero, 2 si es el segundo, etc.)
Por ejemplo, si tenemos una llamada como:
./macro.sh fich otrofich fichresul
y dentro de la macro queremos concatenar los dos primeros ficheros, por orden inverso, en el tercero, podemos poner:
cat $3 $2 >$4
O:
cat $2 $1 >$3
O, quizá:
cat $2 $1 >$4
La primera opción está muy mal: no hay cuatro argumentos, sino 3. La segunda es la correcta. La tercera está regular, ha puesto bien la primera parte, pero ha fallado en el final.
Por ejemplo, si tenemos una llamada como:
./macro.sh origen nuevo
y dentro de la macro queremos copiar el fichero origen en nuevo pondremos:
cp $2 $3
Por ejemplo, si tenemos una llamada como:
./macro.sh santander burgos oviedo
y dentro de la macro queremos copiar todos los ficheros del subdirectorio santander en el subdirectorio oviedo, pondremos:
cp $1/* $2
Por ejemplo, si tenemos una llamada como:
./macro.sh sub fich
y dentro de la macro queremos borrar el fichero fich que está en el subdirectorio sub, pondremos:
rm $1/$2
Mal: No cuentes el nombre de la macro. Ése no es un dato.
Regular: oviedo no es el segundo. Es el tercero.
Bien
Pon el comando para cambiar a jkfdshre el nombre del fichero cuyo nombre va justo detrás de la macro
cp $2 jkfdshre
mv $2 jkfdshre
cp jkfdshre $1
mv $1 jkfdshre
No. cp es para hacer una copia, no para cambiar el nombre.
El fichero a cambiar es el primero, no el segundo argumento.
No. cp es para hacer una copia, no para cambiar el nombre.
Según la estrategia prevista, el segundo comando será el de cambiar el nombre al segundo fichero por el del primer fichero y el tercer paso será cambiar el nombre al fichero de nombre actual jkfdshre (antiguo primer fichero) por el del segundo.

Ponlos y ya tienes la macro. Pruébala con ficheros que no importa que se destruyan. Si te atascas con algo, consulta al profesor.