# Introducción a Linux/Comandos

Los comandos, en su mayor parte, no son realmente más que pequeños programas incorporados en el sistema operativo. Técnicamente, lo único que diferencia los comandos de los programas (o de los scripts) es que los comandos siempre están en carpetas muy concretas (/bin, /usr/bin, y en el caso de haber iniciado sesión como superusuario, /sbin), así que no es necesario especificar dónde se encuentran.
Por ello, todas las reglas de sintaxis aplicables a los comandos son aplicables a cualquier programa o script de Bash, con un cambio: en lugar de escribir el nombre del comando, hay que especificar exactamente dónde esta el programa o script (la ruta del programa o script)
Más abajo se dan ejemplos más concretos, pero como ejemplo introductorio, usaré los comandos cd (cambiar directorio actual) y ls (mostrar contenido de directorio actual)

## Reglas de sintaxis
### Capitalización

Regla número 1: la distinción entre mayúsculas y minúsculas es crucial. Los nombres de los comandos siempre se escriben en minúsculas; los parámetros cambian de significado o son inservibles si se usa la capitalización incorrecta.

### Parámetros (dije Ortega y Gasset, no Ortega y Gasset)

Regla número 2: todos los parámetros se separan por espacios; la consola reconoce la primera palabra como el nombre del comando (o la ruta del programa) y cada cadena de texto entre espacios como un parámetro.
El sistema entendió "acceder a la carpeta Pinky" (el comando cd solo admite un argumento y considera los siguientes cháchara; otro comando podría haber intentado acceder a los archivos "Pinky", "y" y "Cerebro", por ejemplo). Para poder usar un espacio, lo más fácil es entrecomillar el nombre entre apóstrofos:
También se pueden escribir las primeras letras y pulsar la tecla Tabulación para activar el autocompletado. El resultado sera éste:
(de haber varias opciones posibles, mantener pulsada la tecla Tabulación para que aparezcan todas en pantalla. Tecléense unas cuantas letras más, y vuélvase a probar)
La barra inversa (\), que se puede obtener en teclados españoles pulsando Alt Gr + º, es un "carácter de escape". Esto significa que modifica el significado del carácter siguiente: por ejemplo, \n significa "salto de línea". La barra es necesaria porque hay varios símbolos que tienen un significado especial en Bash (el espacio es el más evidente). Si rodea un argumento con apóstrofos, ninguno de estos símbolos usará su significado especial, pero será imposible acceder a ninguna carpeta con apóstrofos.
Existen muchas formas de usar parámetros con apóstrofos, si se sabe sintaxis de Bash. A este nivel básico, la forma más fácil y segura es sustituyendo el apóstrofo por '\.

### Rutas

A estas horas ya habrá advertido el significado de la barra hacia adelante (/); la carpeta que va después de ella está contenida dentro de la carpeta que va antes de ella. Una barra hacia adelante suelta indica el directorio raíz
Cada vez que sea necesario escribir una ruta como un parámetro, se puede escribir:
* explicitando la ruta exacta, en referencia al directorio raíz (si la ruta empieza con una barra)
* indicando la ruta en referencia a la carpeta actual (como se hizo en los ejemplos anteriores)
* en referencia a una de las siguientes abreviaturas (también se pueden usar solas)
** . para la carpeta actual. (Pinky y Cerebro sería sinónimo con ./Pinky y Cerebro) Conveniente para mover archivos desde una carpeta arbitraria a la carpeta actual, o para ejecutar scripts en la carpeta actual. Curiosamente, es posible escribir rm experimento para borrar el archivo "experimento", pero para arrancarlo es necesario escribir ./experimento, a menos que esté en una de las carpetas clave. Es decir, el punto no es obligatorio para los parámetros, pero sí para los nombres del programa a ejecutar.
** .. para el directorio inmediatamente superior. (muy fácilmente combinable: ../.. indica el directorio superior del superior; ../../yinlao indica la carpeta "yinlao" que está en el directorio superior del superior del actual; etc.)
** ~ para la carpeta personal (depende de qué nombre haya usado para iniciar sesión)

### Opciones (un tipo especial de parámetros)

Regla número 3: las opciones se escriben anteponiendo un guion, si constan de una sola letra; o dos, si constan de varias. En casi todos los comandos (o por lo menos en todos los comandos de sistema) todas las opciones que se utilicen de una sola letra se pueden contraer juntando todas las letras y usando un solo guion al principio. Esto funciona excepto cuando las opciones necesiten, a su vez, parámetros; en este caso, el parámetro se aplica a la última opción. Ejemplo: ls -a -l equivale a ls -al

## Lista de comandos

Esta es una lista muy reducida que ofrece las opciones más típicas de los comandos más usados. Los parámetros entre signos menor que y mayor que (<>) deben sustituirse por el valor adecuado; los corchetes indican que el parámetro es opcional. No deben escribirse los corchetes ni los símbolos menor que y mayor que, a menos que sean parte del parámetro.
Para más información, use los comandos de ayuda.

### Comandos de ayuda

| Sintaxis | Explicación |
| info | Información general autoexplicativa. Excesivamente detallada; clasifica los comandos según utilidad. |
| man <comando> | Manual completo (o casi completo) sobre un comando Existe un manual para el propio comando man, al que se accede por man man |
| <comando> --help | Ayuda básica sobre un comando (no todos la ofrecen) |
| <comando> --usage | Sintaxis básica sobre un comando (no todos la ofrecen) |
| whatis <comando> | Información muy reducida sobre un comando |
| apropos <comando> | Parecido al anterior |

### Administración de carpetas y archivos

| Sintaxis | Explicación | Ejemplo |
| dir | lista los ficheros (refiriéndonos a todos los tipos de archivos: directorios, archivos propiamente dichos, enlaces simbólicos, etc.) | |
| ls [-a] [-l] | visualiza los ficheros y carpetas en colores para distinguir los distintos tipos. -a refleja los archivos ocultos, que empiezan por un punto en su nombre; no aparecen normalmente ni en la consola ni en modo gráfico. -l da información extra sobre los archivos en vez de limitarse a escribir los nombres. | |
| touch <ruta> | cambia los metadatos (fecha,hora de creacion) o crea ficheros en blanco | touch -t 03122010 file21.txt touch file21.txt |
| mkdir <ruta> | crea directorios | mkdir ~/Esto\ no\ es\ privado |
| cd <ruta> | | marivi@bellota:~$ cd AutoCAD marivi@bellota:~/AutoCAD$ |
| cd .. | cambia siempre al directorio inmediatamente superior ¡no pegar los puntos al comando como en MS-Dos! No reconocerá el comando | marivi@bellota:~/AutoCAD/examples$ cd .. marivi@bellota:~/AutoCAD$ |
| cd - | cambia siempre al directorio visitado anteriormente | marivi@bellota:~/AutoCAD/example$ cd marivi@bellota:~$ cd - /home/marivi/AutoCAD/example marivi@bellota:~/AutoCAD/example$ |
| rmdir <ruta> | permite eliminar un directorio vacío | |
| cp <origen> <destino> | copia el fichero o directorio <origen> en <destino> | cp -r /home/tarea /root/ruta/Lima |
| mv <origen> <destino> | permite mover y/o cambiar de nombre el fichero <origen> a <destino> | mv Istoria Historia |
| rm [-i] [-r] <ruta> | no mueve a la papelera, borra definitivamente los archivos en principio, elimina ficheros de uno en uno para borrar una carpeta entera es necesario borrar los archivos de dentro primero, bien a mano o mediante la opción -r (recursivo; borra todo el interior) la opción -i hace que pida confirmación antes de borrar, muy conveniente si se usa con la opción -r | rm /home/tarea rm -r /home/Tareas |
| cat <ruta> | visualiza contenido de un fichero; pueden concatenarse varios la visualización se hace sin pausa; si el texto es más largo que la pantalla no se puede recuperar. | cat /etc/passwd |
| more <ruta> | una forma más avanzada de leer un fichero, hace pausas a cada línea. Se puede leer pulsando Intro repetidamente (o espacio para saltar pantallas) | |
| less <ruta> | una forma aún más avanzada de leer un fichero, permite recorrerlo con las flechas de cursor. Pulsar Q para abandondar | |
| pwd | muestra ruta actual | marivi@bellota:~/Memez$ pwd /home/marivi/Memez |
| du | Muestra el uso de disco. En general los archivos se almacenan en bloques de 4KB/4096bytes. Si un archivo es menor seguirá ocupando 4K de espacio en disco. du indica la ocupación real. | /var/log@Host1 # du -sch * 20K acpid 0 apache2 0 auth.log 324K cron 2,1M cups 108K daemons 4,0K incrementalBackup.sh.root.20100101.log 4,0K incrementalBackup.sh.root.20100102.log 4,0K incrementalBackup.sh.root.20100103.log 56K mail 0 maillog 128K messages 1,2M messages.1.gz 3,7M messages.2.gz 2,5M msec.log 35M mysqld ... 111M total |
| df pydf | df disk free, muestra el espacio libre que queda en disco. pydf (pydf == python disk free) realiza la misma tarea pero ordenando en columnas y con colores. df es útil para scripts automatizados mientras que pydf es mejor para ver el consumo manualmente. |
| find | Comando para búsqueda de ficheros. Tiene decenas de opciones que lo hacen extremadamente potente. | Buscar enlaces simbólicos dentro de /etc: find /etc -type l Busca ficheros modificados hace 10 o menos días: find /etc -type f -mtime -10 Busca ficheros modificados hace justamente 10 días: find /etc -type f -mtime 10 Busca ficheros modificados hace 5 o más dias dentro de /etc con nombre extensión sh o php y sobre cada coincidencia ejecuta un nuevo script pasando el nombre del fichero encontrado como parámetro.('' es reemplazado por el nombre del fichero encontrado.). find /etc -type f -name "*sh" -or -name "*.php" -mtime +5 -exec script1.sh \; Para este último caso, podemos utilizar un script en línea sustituyendo -exec script1.sh por una sentencia similar a -exec bash -c " echo \"Fichero:\" ; grep \"patron1\" ; wc -l " |

## Copias de seguridad

| Sintaxis | Explicación | Ejemplo |
| rsync | Permite sincronizar carpetas localmente o en un sistema remoto accesible mediante red, realizar backups incrementales e instantaneas (similares a las del sistema "Time Machine" de MacOSX) de una carpeta o directorio. rsync comprueba antes de copiar un fichero que el mismo no existe ya en el destino, comprueba si hubo cambios y si los hubo copia sólamente la parte del fichero que cambió. Esta comprobación puede multiplicar enormente la velocidad de sincronización (hasta 10 veces en copias locales y hasta 1000 en copias a través de redes WAN -ADSL p.ej-). | Para realizar una sincronización entre 2 directorios, manteniendo en el destino los ficheros que pudieran haber sido borrados en el origen: ~$ rsync -a /var/lib/mysql /media/HD_BACKUPS/mysql ^ ^ Dir.Origen Dir.Destino *La opción -a no es necesaria pero sí conveniente. Para realizar una sincronización entre 2 directorios, eliminando en el destino los ficheros que pudieran haber sido borrados en el origen: ~$ rsync -a --delete /var/lib/mysql /media/HD_BACKUPS/mysql Para realizar una instantanea de un directorio a partir de otra instantanea creada anteriormente (/media/HD_BACKUPS/mysql.201001 en el ejemplo): rsync -a --link-dest=/media/HD_BACKUPS/mysql.201001 \ <--- Última copia /var/lib/mysql \ <--- Dir. Origen /media/HD_BACKUPS/mysql.201008 <--- Dir. Destino La opción --link-dest comprueba antes de copiar en el nuevo directorio (/media/HD_BACKUPS/mysql.201008 en el ejemplo) si el mismo ya existe en la copia anterior indicada en la opción --link-dest. Si existe crea un enlace duro a la misma. Si no copia el fichero. Los enlaces duros permiten acceder a un fichero desde varias rutas alternativas, en este caso desde .../mysql.201001/ruta1 y .../mysql.201008/ruta2. Cuando desde una ruta borramos el fichero con rm, el fichero sigue estando accesible desde el resto de rutas o enlaces duros. Cuando se elimina el último enlace duro el fichero es eliminado. Con esta técnica podemos crear instantaneas de un directorio tal y como estaba en una fecha dada al tiempo que el espacio ocupado en disco es similar a una copia incremental, ya que entre una fecha y otra sólo se almacenan los ficheros que han cambiado. |

### Relativos a permisos y usuarios

| Sintaxis | Explicación | Ejemplo |
| passwd [-d] [<usuario>] | sustituyendo usuario por el nombre de usuario (o no escribiendo nada para el usuario que ejecute el comando) permite cambiar la contraseña, o establecer una nueva si no tiene La opción -d permite borrarla, dejando la cuenta sin contraseña (peligroso) Sólo el superusuario puede cambiar contraseñas que no sean la suya En caso de error la contraseña quedará sin cambios. | marivi@bellota:~$ passwd Cambiando la contraseña para marivi. (actual) contraseña de UNIX: Enter new UNIX password: Retype new UNIX password: Se entiende que los espacios en blanco son para teclear las contraseñas, como es costumbre en GNU/Linux no aparecerán en la pantalla al escribirlas. |
| chmod <permisos> <ruta> | cambia los permisos de acceso a un archivo. Los permisos se pueden dar mediante un número octal o mediante la notación <usuarios afectados><modo de concesión><permisos> donde: los usuarios afectados se expresan con la letra u (usuario propietario), g (usuarios que compartan grupo con el propietario), o (otros usuarios que no compartan grupo), a (todos) o una combinación de varias modo de concesión: añadir privilegios (+), retirarlos (-) o establecerlos como los únicos existentes (=) los permisos en sí, entre otros r (lectura), w (escritura), x (ejecución para archivos, permiso de paso para directorios) Consulte la sección de permisos de archivo para más información | chmod a=rwx konquest Se permite a todos los usuarios leer, escribir y ejecutar konquest chmod u-wx konquest Se deniega al usuario propietario la posibilidad de escribir o ejectuar konquest |
| chown <usuario>[:<grupo>] <ruta> | cambia la propiedad de <ruta> en favor del usuario <usuario>, cambiando también el grupo propietario a <grupo>, si se especifica | chown marivi:bellota Historia |
| sudo <comando con opciones> | ejecuta un comando con privilegios de superusuario; para que funcione es necesario introducir la clave del usuario actual | kant@kant:/etc/ sudo cp fstab fstab~ [sudo] password for kant: |
| su [<usuario>] | cambio de usuario (es necesario introducir la contraseña del nuevo usuario) si no se marca a qué usuario cambiar por defecto prueba a cambiarse por root curiosidad: se puede cambiar a usuario root con la contraseña del usuario normal mediante sudo su | |
| gksu <comando> | versión gráfica de sudo | gksu kate /etc/fstab aparecerá una ventana para introducir en la contraseña, de introducirla correctamente arrancará el comando kate /etc/fstab con permisos de superusuario, cargando su configuración y permitiendo abrir y modificar ese archivo, de permiso restringido. el ejemplo anterior sólo sirve para Kubuntu o un sistema que incluya el editor de archivos kate; en cualquier caso el funcionamiento del comando gksu es el mismo. |

## Otros

| Sintaxis | Explicación | Ejemplo |
| echo <cadena de texto> | muestra en pantalla <cadena de texto> | |
| watch -n secs "comando" | Repite el comando cada secs segundos, refrescando la pantalla | |
| shutdown <tiempo> | reinicia el sistema operativo, ejecutando un init otra vez. El tiempo se escribe en minutos, now para apagar ahora. Son necesarios permisos de superusuario generalmente. | |
| halt <tiempo> | apaga el equipo. Misma sintaxis y permisos que el anterior. | |
| reboot <tiempo> | reinicia el equipo. Misma sintaxis y permisos que el anterior. | |
| cpulimit | Limita el tiempo de CPU dedicada a un proceso. | Ej1: Limitar el tiempo máximo de CPU de los plugins externos de Firefox (válido a partir de Firefox 3.7) cpulimit -e plugin-container -l 30 |

### Manejo de ficheros de texto

En general los siguientes comandos se utilizan en la práctica anidados en tuberías de forma que la salida de un comando se utiliza como entrada para el siguiente eliminando la opción <ruta> lo cual le indica al comando que utilice como fichero de entra la salida del comando anterior. P.ej, para mostrar los 10 primeros resultados de un fichero de texto conteniendo la palabra "amarillo" ejecutaríamos un comando similar a:
2 comandos de texto frecuentemente utilizados y no citados son sed y awk. Estos comandos son muy potentes pero requieren un apartado separado para poder describirlos correctamente.
| Sintaxis | Explicación |
| grep <texto> <fichero> | Muestra las líneas de un fichero de texto que contienen el texto buscado. La opción -v permite mostrar las líneas que no contienen dicho texto. La opción -B 'N' permite mostrar la línea coincidente y las anteriores 'N' lineas (B == before/antes), mientras que la opción -A 'N' muestra también las posteriores 'N' líneas (A == after/después). La opción -i indica que no distingua entre mayúsculas y minúsculas (por defecto sí distingue). |
| head -n 'N' <ruta> | Muestra las 'N' primeras líneas de un fichero de texto. (head == cabeza) |
| tail -n 'N' <ruta> | Muestra las 'N' últimas líneas de un fichero de texto. (tail == cola) |

### Monitorización

En general, las opciones de monitorización pueden ser considerados comandos de nivel avanzado o muy avanzado.
| Sintaxis | Explicación |
| top | permite ver y administrar los procesos en ejecución (útil para matar procesos que cuelguen el sistema) pulsar Q para abandonar, K para matar un proceso (pedirá el número de proceso, visible en la columna izquiefa); < y > para cambiar de página sólo se pueden matar procesos de la propia cuenta; se pueden matar procesos de otras ejecutando el comando como root, pero esto sólo se debería hacer si tiene completa idea de lo que está haciendo. |
| htop | Similar a top, pero con una interfaz basada en menús, más amigable de uso. |
| iotop | Similar a top, pero muestra actividad de entrada/salida a disco (Input/Output top). |
| latencytop | monitoriza las latencias. Una introducción en inglés al mismo puede leerse aquí |
| lsof | Permite mostrar qué procesos están accediendo a un fichero o directorio o qué conjunto de ficheros están siendo utilizados por un proceso (opción lsof -p <pid>, donde pid es el identificador numérico del proceso devuelto por top/htop). En Linux todas las entradas/salidas/dispositivos/conexiones de red son tratadas como ficheros, lo cual en la práctica hace a este comando una herramienta muy potente de monitorización. |
| netstat | Permite ver estadísticas de red (conexiones establecidas y en escucha) |
| vmstat | Permite ver estadísticas de utilización de la memoria |
| iostat | Permite ver estadísticas de lecturas/escrituras a dispositivos externos |
| inotifywatch inotifywait | Las versiones modernas del kernel de Linux permiten notificar a las aplicaciones de usuario cualquier acceso o cambio a un fichero de forma instantánea. Los comandos inotifywatch e inotifywait nos permiten "conectar a la escucha" con el kernel para ser avisados de cualquier cambio producido en uno o varios ficheros de forma instantanea. |
| strace -p <pid> | Permite monitorizar las llamadas desde una aplicación de usuario al núcleo o kernel del sistema. |
| stap | Comando extremadamente avanzado que permite monitorizar el funcionamiento del kernel en tiempo real. Un tutorial en inglés puede encontrarse aquí |

### Gestión de energía

Permite controlar parámetros sobre la gestión de energía, como la frecuencia de la CPU, deshabilitar USBs no usados, ...
| Sintaxis | Explicación |
| powertop | Es un "top" de recursos energéticos. Indica posibles optimizaciones para mejorar el consumo. En un portátil puede llegar a aumentar un 20% la duración de la batería. |

### Descarga de archivos
#### Wget

El uso típico de GNU Wget consiste en invocar desde la línea de comandos una o más URL como argumentos:
El uso más complejo incluye descargas automáticas desde múltiples URLs en un directorio con jerarquía:
Avanzado

### Operadores

| Sintaxis | Explicación | Ejemplo |
| > | Una redirección consiste en trasladar la información de un tipo a otro, por ejemplo de la salida estándar a la entrada estándar o del error estándar a la salida estándar | ls > listado |
| >> | igual que el anterior, pero añade al archivo en vez de sobreescribirlo | |
| < | recupera parámetros de un archivo | cp < ruta |
| | | la salida del comando anterior pasa a ser parámetro del comando siguiente | ls | less |