Soluciones a los ejercicios del curso
Ejercicio 1 Ejercicio: ¿Qué hace la opción -l? ¿Cómo podemos listar en orden de creación e inverso?
Soluciones:
-'ls -l' se utiliza para mostrar información
detallada sobre cada archivo o directorio en la lista.
El resultado de ls -l incluirá, para cada entrada:permiso,entrada,
enlaces,propietario,tamaño, fecha de modificación y nombre.
-La opción 'ls -t' lista los ficheros por orden de la marca
de tiempo (fecha de modificación por defecto).
-La opción 'ls -r' revierte el orden de clasificación.
Escribir resultado
total 640
-rw-rw-r-- 1 johanna johanna 205 may 29 21:46 Base_.Rproj
drwxrwxr-x 2 johanna johanna 4096 may 29 21:46 SQL
-rw-rw-r-- 1 johanna johanna 468 may 29 21:46 README.md
-rw-rw-r-- 1 johanna johanna 623431 may 29 21:46 README.html
drwxrwxr-x 2 johanna johanna 4096 may 29 21:46 Imagenes
-rw-rw-r-- 1 johanna johanna 154 may 29 21:46 _config.yml
drwxrwxr-x 2 johanna johanna 4096 may 29 22:48 Python
drwxrwxr-x 2 johanna johanna 4096 may 30 10:50 Shell
Ejercicio 2 ¿Qué es una ruta relativa?
Las rutas relativas indican el camino para encontrar un elemento,
pero basándonos en el directorio desde el que se ejecuta la orden.
Ejercicio 3 ¿A donde nos lleva cd -? y si volvemos a colocar cd - ¿a donde nos lleva? ¿Cuál es la diferencia entre cd .. y cd -?
-'cd -' imprime el directorio en el que estuvimos anteriormente y
nos cambia a él, si lo volvemos a ejecutar una seguda vez imprime el
directorio actual y nos cambia al directorio actual.
-La diferencia entre 'cd -' y 'cd ..' es que el primero nos redirecciona
al directorio en el que anteriormente estabamos, mientras que el segundo
comando nos direcciona al directorio padre del directorio en el que actualmente
estamos.
Escribir resultado. Por ejemplo, supongamos que estamos en el directorio
/Descargas/Curso_Comp_Cien/Python
entonces suponiendo que el directorio
que estuvimos anteriormente fue /Descargas 'cd -'
nos direccionara a este último,
mientras que 'cd ..'
nos direccionara a /Descargas/Curso_Comp_Cien
.
Ejercicio 4 Ejercicio: Supongamos que tenemos el siguiente árbol de datos en nuestra computadora y que estamos en /Users/thing/. ¿Si colocamos en la terminal ls -F ../backup que nos mostrará?
original/ pnas_final/ pnas_sub/
Escribir resultado
Espacio Resultado
Ejercicio 5 Explora las opciones -s y -S. ¿Hay diferencia entre mayúsculas y minúsculas?
Solución(Atenea):
'ls - s' muestra los archivos y el tamaño de cada archivo respectivamente.
'ls -S' muestra los archivos ordenados por tamaño, comenzando con el más grande.
Output con ‘ls -s’:
total 40
4 Untitled1.ipynb 4 Untitled2.ipynb 32 Untitled.ipynb
Output con ‘ls -S’:
Untitled.ipynb Untitled1.ipynb Untitled2.ipynb
Ejercicio 1 ¿Cuál es el output de la siguiente colección de comandos?
Soluciones (Mariel)
1. $ pwd
Este comando imprime el directorio de trabajo, es decir, la dirección absoluta del directorio en que se encuentra.
2. /Users/haydee/Curso
La terminal arroja un error, puesto que esa serie de caracteres no es un comando reconocido por bash.
3. $ ls -F
La terminal lista los archivos y/o directorios que se encuentran el la ubicación en que se escribió el comando con la especificación de cuales de estos archivos son directorios por medio del nombre del directorio seguido del símbolo ‘/’.
4. archivo.txt carpeta/
La terminal arroja un error, puesto que esa serie de caracteres no es un comando reconocido por bash.
Ejercicio 2 Supon que en el directorio data tienes dos archivos. ¿Cuál de los siguientes comandos te daría como resultado: ethane.pdb methane.pdb.
1. ls *t*ane.pdb
2. ls *t?ne.*
3. ls *t??ne.pdb
4. ls ethane.*
Solución(Atenea):
ls *t*ane.pdb,
ls *t??ne.pdb
Ejercicio 1 ¿Cuál opción nos permite extraer solo la cantidad de líneas del archivo?
$ wc -l *.pdb
Ejercicio 2 De los archivos que están en la carpeta alkane, ¿cuál tiene la menor cantidad de líneas?
Solución (Atenea):
$ wc -l *.pdb
Escribir resultado
9 methane.pdb
Ejercicio 3 Realiza las siguientes instrucciones dos veces cada una. Explora las diferencias. ¿Qué hace el operador »?
Solución(Atenea):
$ echo hola > test1.txt
$ echo hola >> test2.txt
El operador >> sobreescribe la salida sobre el archivo si es que existe y si no existe crea el archivo.
Output(primer comando) despues de ejecutar el comando cat test1.txt
:
hola
Output(segundo comando) despues de ejecutar el comando cat test2.txt
:
hola
hola
Ejercicio 4 Considera el archivo /exercise-data/animal-counts/animals.csv. Después de aplicar los siguientes dos comandos, ¿qué hay en el archivo animals-subset.csv?
$ head -n 3 animals.csv > animals-subset.csv
$ tail -n 2 animals.csv >> animals-subset.csv
Solución (Atenea):
Escribir resultado:
2012-11-05,deer,5
2012-11-05,rabbit,22
2012-11-05,raccoon,7
2012-11-07,rabbit,16
2012-11-07,bear,1
Ejercicio 1 De los archivos que están en la carpeta alkanes, obten los 3 archivos con la menor cantidad de líneas.
Solución(Atenea):
$ wc -l *.pdb | sort | head -n 3
Escribir resultado
9 methane.pdb
12 ethane.pdb
15 propane.pdb
Ejercicio 2 Explora el archivo exercise-data/animals-counts/animals.csv. ¿Cuál será el resultado de la siguiente instrucción?
$ cat animals.csv | head -n 5 | tail -n 3 | sort -r > final.txt
Solución(Atenea):
2012-11-06,rabbit,19
2012-11-06,deer,2
2012-11-05,raccoon,7
Ejercicio 3 ¿Porqué se necesita colocar el sort antes del uniq?
Solución(Atenea):
El comando uniq solo devuelve los elementos duplicados de un archivo/directorio si es que esta ordenado.
Escribir resultado
Ejercicio 4 Si quisiéramos ver cuantos animales hay de cada tipo, ¿que instrucción tendríamos que usar?
Solución (Mariel)
cat animals.csv | uniq | wc -l
Ejercicio 1 Crea un ciclo que muestre en pantalla (echo) todos los números del 0 al 9.
Solución(Atenea):
$ for i in {0..9}; do echo "$i"; done
Ejercicio 2 Ve a la carpeta shell-lesson-data/exercise-data/alkanes y lista lo que hay.
1) ¿Cuál es el output del siguiente código?
$ for datafile in *.pdb
> do
> ls *.pdb
> done
2) ¿Y de este código?
$ for datafile in *.odb
> do
> ls $datafile
> done
Solución(Atenea): Explica las diferencias.
Con el primer ciclo para cada archivo con extensión .pdb se esta imprimiendo los nombres de todos los archivos con esta extensión.
Mientras que para el segundo ciclo para cada archivo con extensión .pdb se imprime su nombre solo una vez.
Salida 1:
alkanes.pdb all.pdb cubane.pdb ethane.pdb methane.pdb octane.pdb pentane.pdb propane.pdb
alkanes.pdb all.pdb cubane.pdb ethane.pdb methane.pdb octane.pdb pentane.pdb propane.pdb
alkanes.pdb all.pdb cubane.pdb ethane.pdb methane.pdb octane.pdb pentane.pdb propane.pdb
alkanes.pdb all.pdb cubane.pdb ethane.pdb methane.pdb octane.pdb pentane.pdb propane.pdb
alkanes.pdb all.pdb cubane.pdb ethane.pdb methane.pdb octane.pdb pentane.pdb propane.pdb
alkanes.pdb all.pdb cubane.pdb ethane.pdb methane.pdb octane.pdb pentane.pdb propane.pdb
alkanes.pdb all.pdb cubane.pdb ethane.pdb methane.pdb octane.pdb pentane.pdb propane.pdb
alkanes.pdb all.pdb cubane.pdb ethane.pdb methane.pdb octane.pdb pentane.pdb propane.pdb
Salida 2:
alkanes.pdb
all.pdb
cubane.pdb
ethane.pdb
methane.pdb
octane.pdb
pentane.pdb
propane.pdb
Ejercicio 3 En el directorio shell-lesson-data/exercise-data/alkanes, ¿cuál sería el output del siguiente código?
$ for filename in c*
> do
> ls $filename
> done
Y si en lugar de c* usamos c?
Solución(Atenea):
El segundo código marca un error puesto que no existe ningún archivo con ese nombre.
Output del primer código:
cubane.pdb
Ejercicio 4 Explora el siguiente código. ¿Cuál es el efecto de guardar en este ciclo?
$ for alkanes in *.pdb
> do
> echo $alkanes
> cat $alkanes > alkanes.pdb
> done
¿Cuál sería la diferencia si usamos ahora »?
Solución(Atenea):
El primer ciclo imprime los nombres de los archivos con extensión .pdb y además
copia el contenido del último archivo con tal extensión en el archivo alkanes.pdb.
El segundo ciclo imprime los nombres de los archivso con extensión .pdb pero
difiere en que sobreescribe el contenido de cada uno de los archivos con tal
extensión en alkanes.pdb
Ejercicio 5 Crea un ciclo que muestre las últimas 20 líneas de cada archivo en la carpeta creatures.
Solución(Atenea):
$ for filename in *.dat; do cat $filename | tail -n20 ; done
Ejercicio 6 Crea un ciclo for que copie los dos archivos a dos nuevos archivos llamados original-basilisk.dat, original-unicorn.dat y original-minotaur.dat.
Solución(Atenea):
$ for filename in *.dat; do cp $filename original-$filename; done
Ejercicio 7 Supongamos que queremos previsualizar los comandos que el siguiente ciclo va a realizar en lugar de correrlo primero para asegurarnos de que está haciendo lo que queremos.
$ for filename in *.pdb
> do
> cat $filename >> all.pdb
> done
¿Cuál de los siguientes dos códigos sería el correcto para revisar los comando a ejecutarse con el ciclo?
# Versión 1
$ for filename in *.pdb
> do
> echo cat $filename >> all.pdb
> done
# Versión 2
$ for filename in *.pdb
> do
> echo "cat $filename >> all.pdb"
> done
Corre los dos códigos y explora el contenido del archivo all.pdb.
Solución(Atenea):
El segundo código permite visualizar los cambios que realiza el ciclo sobre el archivo all.pdb.
Output código 1:
cat alkanes.pdb
cat cubane.pdb
cat ethane.pdb
cat methane.pdb
cat octane.pdb
cat pentane.pdb
cat propane.pdb
El segundo código no altera el archivo all.pdb. Ejercicio 8 En la carpeta norht-pacific-gyre se encuentran dos scripts (.sh) y una lista de archivos. Esta lista de archivos tiene terminaciones A, B y en el caso de que la terminación sea Z significa que el archivo está corrupto.
8.1¿Cómo podrías darte cuenta que los archivos con terminación Z están corruptos?
Solución(Atenea):
Una posibilidad de distinguir si un archivo esta corrupto o no, es comparar su tamaño con el de los demás, si este difiere mucho
entonces se trata de un archivo corrupto.
Usando el comando ls -sh
vemos que sólo el archivo 4NENE02018B.txt esta corrupto.
total 140K
8.0K NENE01751A.txt 8.0K NENE01729B.txt 8.0K NENE01978B.txt 8.0K NENE01843B.txt 4.0K NENE02018B.txt
8.0K NENE01751B.txt 8.0K NENE01843A.txt 8.0K NENE02043A.txt 8.0K NENE01971Z.txt
8.0K NENE01729A.txt 8.0K NENE02043B.txt 8.0K NENE01978A.txt 8.0K NENE01736A.txt
8.0K NENE01812A.txt 8.0K NENE02040A.txt 8.0K NENE02040Z.txt 8.0K NENE02040B.txt
Supongamos que queremos ejecutar el script llamado goostats.sh, este script necesita recibir dos cosas, el archivo de entrada y el nombre del archivo de salida. Supongamos que queremos correr este script para todos los archivos con terminación A y B y que queremos que los archivos de salida se llamen stats-$datafile
8.2 Crea un ciclo que te muestre en pantalla el nombre del archivo a usar como input.
Solución(Atenea):
$ for datafile in {*A.txt,*B.txt}
> do
> echo $datafile
> done
8.3 Crea un ciclo que te muestre en pantalla el nombre del archivo de salida con el formato indicado. Pero quieres asegurarte que para el archivo input sea el nombre correcto el del archivo de salida.
Solución(Atenea):
$ for datafile in {*A.txt,*B.txt}
> do
> echo stats-$datafile
> done
8.4 Crea un ciclo que muestre los comandos a usarse para correr el script con los archivos de entrada y de salida del paso 2 y 3. Para correr un script como se indica, se usa el comando bash nombre_archivo.sh input output.
$ for datafile in {*A.txt,*B.txt}
> do
> bash goostats.sh $datafile stats-$datafile
> done
8.5 Agrega un echo $datafile para saber en que archivo va tu ciclo.
$ for datafile in {*A.txt,*B.txt}
> do
> echo $datafile
> bash goostats.sh $datafile stats-$datafile
> done
Ejercicio 1 El archivo animals.csv ya vimos que es un archivo separado por comas que indica las especies y la cantidad de cada uno. Crea un script que se pueda aplicar a cualquier cantidad de archivos con ese formato y que te diga las especies únicas de cada archivo. Crea 3 archivos similares al animals.csv (copia y modifica) y prueba tu script.
Solución(Atenea):
El contenido del script que llamaremos especies.sh es el siguiente:
for archivo in $@
do
echo "Para " $archivo "sus especies únicas son: "
cut -d, -f2 $archivo| sort | uniq
done
$ bash especies.sh animals.csv
Para animals.csv sus especies únicas son:
bear
deer
fox
rabbit
raccoon
Ejercicio 2 Corre el siguiente comando:
$ history | tail -n 5 > recientes.sh
¿Qué contiene ese archivo? ¿Observa la última línea del archivo? ¿Porqué guarda esa línea?
Solución(Atenea): El archivo contiene los ultimos 5 comandos ejecutados en bash(incluyendo el comando ejecutado anteriormente). Guarda este último ya que el comando history guarda todos los comandos ejecutados.
Salida del archivo recientes.sh:
1807 cat animals.csv
1808 cat especies.sh
1809 bash especies.sh animals.csv
1810 $ history | tail -n 5 > recientes.sh
1811 history | tail -n 5 > recientes.sh
Ejercicio 3 En la carpeta alkanes supongamos que tenemos un script.sh que contiene lo siguiente:
$ head -n $2 $1
$ tail -n $3 $1
Dentro del directorio alkanes, corre lo siguiente:
$ bash script.sh '*.pdb' 1 1
Solución(Atenea): ¿Qué esperas obtener?
Espero obtener el primer y el último renglon de cada archivo con extensión .pdb de la carpeta alkanes.
Por cuestiones de espacio, sólo se imprimira las primeras lineas despues de imprimir el comando anterior.
==> alkanes.pdb <==
COMPND PROPANE
==> all.pdb <==
cat alkanes.pdb
==> cubane.pdb <==
COMPND CUBANE
Ejercicio 4 Crea un script llamado longest.sh que reciba como argumentos un directorio y una extensión de archivos y que te devuelva el archivo en el directorio, que tenga esa extensión, con el mayor número de líneas.
Solución(Atenea):
El contenido de longest.sh debera ser similar a:
wc -l $1/*$2| sort -r | head -n2|tail -n1
Si ejecutamos lo siguiente obtendremos el siguiente output:
$bash longest.sh alkanes '.pdb'
129 alkanes/alkanes.pdb
Ejercicio 5 Considera los archivos que están en la carpeta alkanes. Explica que hace cada uno de los siguientes scripts al correrlos como bash script1.sh *.pdb, bash script2.sh *.pdb y bash script3.sh *.pdb.
# Script 1
echo *.*
# Script 2
for filename in $1 $2 $3
do
cat $filename
done
# Script 3
echo $@.pdb
Solución(Atenea):
El primer script imprime todos los nombres de archivos y directorios que incluyan en su nombre un punto.
El segundo script imprime el contenido de los 3 primeros archivos con extensión .pdb
Por último el tercer archivo imprime el nombre de todos los archivos con extensión .pdb
Ejercicio 6 (Debugging) Supongamos que tienen el siguiente script do-errors.sh en la carpeta north-pacific-gyre:
# Calcular estadisticas para los archivos
for datafile in "$@"
do
echo $datafile
bash goostats.sh $datfile stats-$datafile
done
Corre en la línea de comandos:
$ bash do-errors.sh NENE*A.txt NENE*B.txt
No muestra ninguna salida. Para ver porque, vamos a correrlo de nuevo con la opción -x:
$ bash -x do-errors.sh NENE*A.txt NENE*B.txt
¿Cuál es el output? ¿Cuál es la línea responsable del error?
Solución(Atenea):
$ bash -x do-errors.sh NENE*A.txt NENE*B.txt
Ejercicio 1 ¿Cómo obtendrían solo lo siguiente del archivo haiku.txt?
and the presence of absence.
Respuesta (Mariel)
grep sence haiku.txt
Escribir resultado
and the presence of absence:
Ejercicio 2 El archivo que se encuentra en la carpeta animal-counts/animals.csv contiene una lista de animales, con su fecha de observación y cuantos animales se observaron.
2012-11-05,deer,5
2012-11-05,rabbit,22
2012-11-05,raccoon,7
2012-11-06,rabbit,19
2012-11-06,deer,2
2012-11-06,fox,4
2012-11-07,rabbit,16
2012-11-07,bear,1
Supongamos que queremos crear un script que tome como primer argumento la especie del animal y como segundo argumento el directorio. El script nos debe regresar un archivo llamado especie.txt que contenga una lista de fechas y el número de veces que se observo esa especie. Por ejemplo, rabbit.txt tendría que contener la siguiente información:
Usa las opciones de ayuda de los comandos cut y grep (puedes usar man grep o man cut también para pedir ayuda de esos comandos, la palabra man se refiere a manual.
Usa las opciones de ayuda de los comandos cut y grep (puedes usar man grep o man cut también para pedir ayuda de esos comandos, la palabra man se refiere a manual.)
```python
Respuesta
Escribir resultado
Espacio Resultado
Ejercicio 3 En la carpeta exercise-data/writing se encuentra el texto completo de Mujercitas LittleWomen.txt. Usando un for encuentra que hermana aparece más veces: Jo, Meg, Beth, Amy.
Respuesta (Mariel)
Comando
for name in Jo Meg Beth Amy
do grep -n ${name} LittleWomen.txt | wc -l
done
1528
685
463
643
**soluciones:**
Francisco:
```python
for hermana in "^Jo" "^Meg" "^Beth" "^Amy"; do grep -w -E "$hermana" LittleWomen.txt | wc -l; done
139
72
46
63
La hermana que más aparece es Jo
Ejercicio 4 ¿Cómo podrías mostrar en color lo que estás buscando? Explora la ayuda de grep
Respuesta (Mariel)
grep --color 'cadena_de_char' <archivo>
```python
grep --help
Ahí encontramos lo siguiente
grep --color=auto "texto a buscar" archivo
>>>>>>> refs/remotes/origin/main
Ejercicio 5 La opción -v en grep busca todo lo que no concuerde con el patrón indicado. En la carpeta creatures, ¿cómo listarías todos los archivos que terminen en .dat menos el que se llama unicorn?
Respuesta (Mariel)
grep -v *unicorn* | ls *.dat
find . -type f -name '*.dat' | grep -v './unicorn.dat'
Escribir resultado
./basilisk.dat
./minotaur.dat
./original-basilisk.dat
./original-minotaur.dat
./original-unicorn.dat
Ejercicio 1 Crea un case statement para adivinar tu edad. Debes pedirle al usuario que introduzca el número correspondiente a tu edad y que los casos o patrones obtengan por resultado una frase referente a si adivinaron o no su edad. Realiza lo mismo con un if.
Respuesta (Mariel)
echo "¿Qué edad crees que tengo?"
read edad
case $edad in
!=24)
echo "No, intenta de nuevo";;
=24)
echo "Que buen ojo, es correcto";;
esac
Soluciones Francisco:
para case: con nano hacemos el siguiente script y lo guardamos como edad.sh;
echo "Adivina mi edad:"
read edad
case $edad in
26)
echo "adivinaste";;
*)
echo "no le sabes"
esac
corremos
bash edad.sh
24
no le sabes
Para if: con nano hacemos el siguiente script y lo guardamos como ifedad.sh;
echo adiviname la edad
read edad
if [ $edad == 26 ]; then
echo adivinaste
else
echo no le sabes
fi
corremos
bash ifedad.sh
26
adivinaste