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 el nombre de un subdirectorio y de un sufijo y que cambie el nombre de todos los ficheros que acaben en ".sufijo" añadiéndoles ".viejo". Por ejemplo, si la llamada es:

./macro.sh casa pdf

Entonces, tras la llamada, todos los ficheros que acaben en .pdf del subdirectorio casa se llamarán .pdf.viejo 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 usar mv para cambiar todos los nombres de golpe, porque no lo admite. Entonces tenemos que pasar uno a uno, repitiendo la operación de cambio de nombre. Es decir, necesitamos un ciclo.

Vamos a ver cómo se organiza un ciclo de este tipo

Plantilla a poner
for variable in patrón
do
comandos ...
done
...
Siempre empieza con for
Después va el nombre de una variable (el que queramos, y sin $) que es donde va a meter sucesivamente cada uno de los casos
Después la palabra in
Después el patrón del que tiene que buscar todos los casos. Es decir, que habrá cosas como * ó ?
En la siguiente línea ponemos do
En las siguientes líneas ponemos los comandos que hagan lo que sea con cada uno de los ítems. Lógicamente usarán la variable, que aparecerá con un $ delante
Tras los comandos, cerraremos el ciclo con una línea en que ponga done
Por ejemplo, si queremos pasar todos los ficheros de este directorio a un subdirectorio independiente para cada uno que se llame como él pero con el añadido ".dir", ¿podríamos hacer la cabecera del ciclo?:
for varfich *
do
...
O, ¿qué tal?:
for $varfich in ?
...
O, ¿quizás?
for varfich in *
...
El primer caso está regular, se ha olvidado del in.

El segundo está bastante destrozado: la variable va sin $ en el for y si pone ? sólo cogerá los ficheros con nombre de una sola letra.

El tercero vale perfectamente.

Por ejemplo, si queremos por cada archivo .wav queremos hacer cierta operación, ¿qué tal estaría una cabecera de ciclo como?:
for $fichwav in *.wav
Por ejemplo, si queremos por cada archivo .mp3 queremos hacer cierta operación, ¿qué tal estaría una cabecera de ciclo como?:
for mp3 in *.mp3
Por ejemplo, si queremos por cada archivo .midi queremos hacer cierta operación, ¿qué tal estaría una cabecera de ciclo como?:
for *.midi
Regular: El nombre de la variable sólo lleva $ cuando se usa su valor, no cuando se le va a dar valor, así que aquí no tiene que llevar
Bien La variable se puede llamar como queramos, siempre que no coincida con alguna otra palabra usada por él (for, in, if, ...)
Mal: Falta la variable y el in
Pon la cabecera del ciclo que recorre todos los archivos del directorio dado y que tengan el sufijo dado:
for fich in directorio/*.sufijo
for $fich in 1, *.2
for fich in $1/*.$2
for $directorio/*.$sufijo
No existe algo que se llame directorio y el sufijo no es exactamente sufijo, sino lo que haya dicho el usuario
No, ¿qué son 1 y 2 así a secas?
Vale.
No, no existen las variables directorio y sufijo
Dentro del ciclo pon lo primero la línea con el do y debajo la del done, para que no se nos olvide. Entre ambas abre hueco que van los comandos de lo que hay que hacer con cada uno.

Y lo único que hay que hacer con cada uno es cambiarle el nombre, añadiéndole ".viejo". Para ello tenemos que usar el nombre de cada uno que lo tenemos en la variable.

Vamos a ver cómo usamos una variable en un comando

Plantilla a poner
comando ...$variable...
Donde haya que poner el valor se empieza poniendo un $
Después se pone el nombre de la variable
Por ejemplo, si queremos meter al final del fichero datos la información del fichero cuyo nombre está en la variable varfich, veamos qué tal estaría:
file varfich >>datos
o quizá:
file $varfich >>datos
La primera opción fallará malamente: irá a por un fichero que se llame exactamente varfich. La segunda es la correcta.
Por ejemplo, si queremos hacer una copia del fichero cuyo nombre está en fich en el subdirectorio copias, ¿qué tal:
cp fich copias
Por ejemplo, si queremos borrar el fichero messages que está en el subdirectorio indicado por la variable subdir, ¿qué tal:
rm $subdir/messages
Mal: Hay que poner delante $ para recoger el valor de la variable
Bien
Pon el comando para cambiar el nombre del fichero correspondiente añadiéndole .viejo
cp fich .viejo
cp $fich .viejo
mv fich fich.viejo
mv $fich $fich.viejo
No. cp es para hacer una copia, no para cambiar el nombre.
No. cp es para hacer una copia, no para cambiar el nombre.
Hay que poner delante $ para recoger el valor de la variable
Bueno, pues ya está. Pruébala con ficheros que no importa que se destruyan. Si te atascas con algo, consulta al profesor.