Comandos Básicos en Bash
Índice
- Navegar en el sistema de archivos con Bash
- Ver archivos y carpetas en Bash
- Crear y borrar archivos y carpetas en Bash
- Mover y copiar archivos y carpetas en Bash
1. Navegar el sistema de archivos con Bash
En esta sección se describirá cómo cambiar el directorio de trabajo usando el comando cd
. Así mismo, se va a explicar como mostrar en una lista los contenidos de un directorio usando el comando ls
. Por último se observará cómo funcionan las opciones -l
y -a
del comando ls
.
Para empezar, se debe abrir la aplicación Terminal. A través de esta aplicación el usuario interactua con Bash en macOS. Al abrir la Terminal por primera vez, Bash se ubicará en el directorio home del usuario. Usted puede ver en donde se encuentra en Bash mirando la información que se despliega en la Terminal como se muestra a continuación:
user:~ username$
El carácter de la virgulilla ~
es un carácter especial que representa el directorio home del usuario actual. Para ver la ruta completa del directorio se utiliza el comando pwd
que significa print working directory. El comando pwd
imprime la ruta absoluta del actual directorio de trabajo:
user:~ username$ pwd
/Users/username
Si se quiere cambiar el directorio de trabajo actual se usa el comando cd
que significa change directory. Imáginemos que se va a navegar al directorio repos/suabochica
. A medida que escribe la ruta, puede presionar la tecla Tab
para auto completar la ruta. Una vez cambiado el directorio, se puede ver que la porción después del carácter dos puntos (:
) cambió para mostrar el nuevo directorio al que se navegó.
user:~ username$ cd repos/suabochica
user:suabochica username$
Ahora que esta en el directorio suabochica
vamos a ver que otros archivos y carpetas se tienen en este directorio. Para hacer eso se ejecuta el comando ls
que significa list. Asumimos que el directorio suabochica
tiene dos archivos: index.js
y index.html
user:suabochica username$ ls
index.html index.js
Los archivos del directorio suabochica
se muestran en una lista plana, y no se da mucha información de dichos archivos. Algo que podemos hacer es usar la opción -l
del comando ls
para mostrar un listado largo con más información de los contenidos de la carpeta actual:
user:suabochica username$ ls -l
-rw-r--r-- 1 username staff 0 Feb 19 20:23 index.html
-rw-r--r-- 1 username staff 21 Feb 19 20:23 index.js
Esta información se lee de la siguiente manera:
-rw-r--r--
: Son los permisos que existen sobre el archivousername
: Es el usuario propietario del archivostaff
: Grupo propietario del archivoFeb 19
: Fecha de creación o de última modificaciónindex.html
: Nombre del archivo
Generalmente, el sistema de archivos oculta algunas carpetas y algunos archivos. Para ver los archivos y los directorios escondidos, se usa la opción -a
que significa all. Supongamos que suabochica
es un repositorio git
, y por tanto debe tener un directorio /.git
oculto. El siguiente comando muestra el directorio escondido:
user:suabochica username$ ls -la
drwxr-xr-x 5 username staff 160 Feb 19 20:36 .
drwxr-xr-x 3 username staff 96 Feb 19 20:36 .
drwxr-xr-x 9 username staff 288 Feb 19 20:36 .git
-rw-r--r-- 1 username staff 0 Feb 19 20:23 index.html
-rw-r--r-- 1 username staff 21 Feb 19 20:23 index.js
En la tercera línea de la la salida del comando ls -la
se puede ver la carpeta /.git
. Un archivo y un directorio se diferencian por que los directorios tienen una d
al principio de la información que indican los permisos. Esta salida también nos muestra dos directorios: /.
y /..
. El directorio /.
corresponde al directorio de trabajo actual, y el directorio /..
corresponde al directorio padre de la carpeta actual en la que se encuentra el usuario. Estas son carpetas especiales configuradas por el sistema operativo y el sistema de archivos.
En consecuencia, si usamos el comando cd
sobre el directorio /..
se va a regresar a la carpeta repos
.
2. Ver archivos y directorios en Bash
Algunas veces cuando se trabaja desde la línea de comandos, puede ser útil ver los contenidos de un archivo directamente desde la terminal o abrir el archivo con determinada aplicación. En esta sección se explicará como ver los archivos desde la terminal usando los comandos cat
y less
. Para abrir los archivos y directorios se usará el comando open
.
Tomaremos como referencia la estructura de archivos de un repositorio npm
para indicar los propositos de los comandos cat
y less
. Estos repositorios suelen tener un archivo package.json
en donde se listan todos los paquetes consumidos por la aplicación.
Una herramienta útil para revisar de manera rápida los contenidos de un archivo es cat
. Se puede usar el comando cat
sobre el archivo package.json
de la siguiente manera:
user:suabochica-npm username$ cat package.json
Este comando descarga el contenido del archivo package.json
directamente en nuestra terminal de Bash y lo imprime. Dependiendo de la aplicación web, el package.json
puede ser un archivo largo. Cuando el archivo es largo, es necesario usar la barra de desplazamiento y navegar hacia arriba para ver los contenidos al inicio del archivo. Adicionalmente, se puede usar un el parámetro -n
del comando cat
y el nombre de archivo para mostrar el contenido del archivo junto con los número de línea:
user:suabochica-npm username$ cat -n package.json
Desafortunadamente, el comando cat
es incómodo para ver archivos grandes ya que resulta confuso navegar solo con la barra de desplazamiento.
El comando apropiado para ver el contenido de los archivos grandes es less
:
user:suabochica-npm username$ less package.json
Este comando introduce unos cambios en la interfaz de usuario de la terminal, ya que los comandos previos y el historial desde Bash desaparece y lo único que podemos observar es el contenido del archivo desde el inicio.
less
nos da unas herramientas de navegación desde el teclado que son familiares para aquellos desarrolladores que usan el editor vim
.
Shift + G
para saltar a la última línea del archivoG
para ir a la primera línea del archivo/
para ejecutar búsquedas de palabras en el contenido del archivoQ
para salir de la visualización deless
y regresar a la pantalla normal de Bash.
Por último, otra herramienta útil para examinar archivos y carpetas es el comando open
. Este comando usa la aplicación externa que este configurada por defecto para ver los contenidos de los directorios y los archivos.
user:suabochica-npm username$ open .
En macOS, el comando anterior abrirá el directorio actual /.
con la interfaz de usuario de Finder. El comando open
también puede abrir con Finder los directorios escondidos.
Del mismo modos, también podemos usar el comando open
sobre archivos. En este caso, open abrirá el archivo con la aplicación por defecto asociada a abrir los archivos con esa extensión. En consecuencia, si se ejecuta:
user:suabochica-npm username$ open lib/npm.js
El archivo JavaScript se abrirá con el editor de texto asociado (Visual Studio Code o Sublime).
3. Crear y borrar archivos y directorios en Bash
Una de las cosas mas útiles que se pueden automatizar con Bash es crear y borrar archivos y directorios. En esta sección se explicará el comando touch
para crear un archivo, y como anexar el contenido con el comando echo
. Posteriormente, se revisará como crear directorios con el comando mkdir
y por último se enseñara como remover archivos y directorios.
Para crear un archivo en Bash, se usa el comando touch
en conjunto con el nombre del archivo. Para este caso, el nombre del archivo sera file.txt
. El siguiente comando creará el archivo file.txt
:
$ touch file.txt
El signo pesos (
$
) se utiliza para ilustrar que la session en bash corresponde a un usuario normal
Al utilizar el comando ls
para ver los contenidos del directorio actual, observamos la existencia del archivo file.txt
.
$ ls
file.txt
En este punto, el archivo file.txt
estará vacío. Para agregar contenido dentro de este archivo se puede utilizar el comando echo
. echo
es una especie de console.log
en Bash. Si corremos el comando echo 'hi'
se imprimirá el string hi
$ echo 'hi'
hi
Si se usa el comando echo 'hi'
junto con el operador right angle bracket (>
) y también se especifica el nombre del archivo file.txt
, la cadena de caracteres 'hi'
se redirigirá dentro del archivo file.txt
$ echo 'hi' > file.txt
$ cat file.txt
hi
Si se ejecuta el mismo comando pero esta vez se cambia el contenido de la cadena de caracteres por 'hi again'
y se imprime el contenido con cat
obtenemos:
$ echo 'hi again' > file.txt
$ cat file.txt
hi again
Si se hace este proceso varias veces, el contenido del archivo file.txt
será sobreescrito.
Si se quiere anexar contenido al archivo, por ejemplo la cadena de caracteres hello world
se deben usar dos operadores right angle bracket (>>
):
$ echo 'hello world' >> file.txt
$ cat file.txt
hi again
hello world
El comando anterior anexa el contenido al final del archivo. Por otra parte, mientras touch
es una forma común de crear inicialmente un archivo vacío, se puede utilizar un atajo para crear un archivo con contenido a través del comando echo
. Para ello, se usa el comando echo 'hola'
, el nombre del archivo que se va a crear y el operador right angle bracket:
$ echo 'hola' > file2.txt
$ cat file2.txt
hola
Para hacer un directorio en Bash, se usa el comando mkdir
. Solo es necesario pasar el nombre del directorio, en este caso, folder
.
$ mkdir folder
Al revisar los contenidos de nuestro directorio actual se observa lo siguiente:
$ ls
file.txt file2.txt folder
Se tienen los dos archivos que se crearon anteriormente y el directorio que se acabo de crear. Ahora se quiere crear varios directorios anidados al mismo tiempo. Para hacerlo, es necesario usar el indicador -p
y así crear cada uno de esos directorios intermedios según sea necesario. De lo contrario, el comando mkdir a/b/c
no permitirá la creación de las carpetas, ya que de forma predeterminada el comando mkdir
espera una ruta de archivo hasta el final. Es decir, espera que los directorios /a
y /b
estén creados para llegar a /c
.
$ mkdir -p a/b/c
$ ls
a file.txt file2.txt folder
$ ls a/b
c
Para remover un archivo se usa el comando rm
. Continuando con el ejemplo anterior, vamos a remover el archivo file.txt
y luego imprimimos los contenidos del directorio:
$ rm file.txt
$ ls
a file2.txt folder
Observe que el comando rm
borra el archivo de manera permanente. El archivo no se mueve a papelera de reciclaje o algo por el estilo.
Por defecto el rm
solo borra archivos. Para remover directorios es necesario la opción -r
que significa recursive. Al pasar el indicador -r
el comando removerá recursivamente el directorio y todo lo que contiene.
$ rm -r folder
$ ls
a file2.txt
A menudo, se utiliza en conjunto el indicador -r
y el indicador -f
. La opción -f
es una especie de opción nuclear e impide que Bash solicite confirmación del usuario para eliminar un archivo, así como el error de salida si no existe un archivo o directorio. Al ejecutar este comando sobre el directorio /a
, se eliminará la carpeta y todos sus contenidos también.
$ rm -rf a
$ ls
file2.txt
4. Mover y copiar archivos y directorios con Bash
En esta sección se explicará como mover y renombrar archivos con el comando mv
y como copiarlos con el el comando cp
.
El comando mv
permite mover archivos y directorios. Imaginemos una carpeta que tiene un archivo JS (index.js
) y un directorio src
. El directorio src
esta vacío.
Ahora se quiere mover el archivo index.js
dentro de la carpeta src
. Para lograrlo, solo es necesario pasar el archivo que se desea mover y luego la ruta destino. Es posible pasar el nombre completo del archivo en la ruta destino
$ mv index.js src/index.js
Si el propósito es cambiar el nombre del archivo, se debe pasar el archivo original y el nuevo nombre del archivo como segundo parámetro. Por ejemplo, vamos a cambiar el nombre del archivo a.js
por b.js
. El archivo a.js
fue creado con el comando touch a.js
. Para lograrlo se corre el siguiente comando:
$ mv a.js b.js
$ ls
b.js src
En esta carpeta se tiene también el directorio src
. Ahora se quiere renombrar el directorio src
por lib
. Para hacerlo se ejecuta el siguiente comando:
$ mv /src lib
$ ls
b.js lib
Para concluir el tema de mover directorios, el último ejemplo consiste en mover todo el contenido de lib
dentro del directorio src
. Para recrear la carpeta src
ejecutamos mkdir src
, y ahora se va usar el asterisco (*
) para agarrar todo los contenidos de lib
(archivo y carpetas) y ponerlos en src
. El comando para lograrlo es:
$ mv lib/* src/
Se revisan los contenidos y se obtiene:
$ ls lib/ (empty)
$ ls src/
index.js
Para copiar un archivo se usa el comando cp
. Para ilustrar el comando se va a crear un archivo README.md
. Este archivo se va a copiar y dicha copia se pondrá en el directorio src
.
% echo "hello" > README.md
$ cp README.md src/README.md
Al copiar un archivo, también es posible cambiar el nombre de la copia si se desea. Por ahora se va a mantener el nombre del archivo original. Aún así, es necesario escribir el nombre del archivo en el segundo parámetro.
Si se imprimen los contenidos del directorio src
se van a tener los mismos contenidos:
$ ls src/
README.md index.js
$ car src/README.md
hello
Finalmente si se quiere copiar todos los contenidos (archivos, carpetas y sub-carpetas) dentro de otro directorio, se debe usar el comando cp
utilizando la opción -R
, que significa recursive. El ejemplo para mostrar el uso recursivo será el hecho de copiar todo el contenido dentro del directorio src
dentro de lib
. Nuevamente se usa el asterisco (*
), que es un comodín en Bash que significa todo y será una ayuda para lograr el cometido:
$ cp -R src/* lib/
$ ls lib/
README.md index.js
$ ls src/
README.md index.js
Recapitulación
En este escrito se han explicado los comandos básicos de bash para navegar el sistema de archivos, ver los contenidos de los archivos y las carpetas, crear, borrar, mover y copiar archivos y carpetas. En la siguiente publicación se tratarán los comando avanzados grep
, para hacer búsqueda de texto en archivos y curl
, para hacer peticiones HTTP desde Bash.