====== Snippets CLI ====== Recetas útiles para la línea de comandos. **Ejecuta el último comando como root**: sudo !! ===== Sistema ===== **Mostrar los 5 ficheros que más ocupan**: du -hs * | sort -rh | head -5 * ''du -hs'': muestra un total (''s'') del espacio ocupado por los directorios en formato humano (''h'') * ''sort -rh'': ordena líneas de forma decreciente (''r'') de forma numérica (''h'') * ''head -5'': muestra solo las 5 primeras líneas de resultado. * [[https://www.tecmint.com/find-top-large-directories-and-files-sizes-in-linux/|How to Find Out Top Directories and Files (Disk Space) in Linux]] (tecmint.com) **Mostrar sistemas de ficheros montados en columnas**: mount | column -t **Obtener dirección IP pública**: curl ifconfig.co curl ifconfig.me **Cerrar la shell manteniendo sus procesos en funcionamiento**: ^z; bg; disown Lo que hacemos es suspender la ejecución del proceso actual (Ctrl + %%z%%), luego lo pasamos a segundo plano (''bg'') y finalmente eliminamos su asociación con la shell actual (''disown'') Si sabemos de antemano que vamos a querer cerrar la shell tras ejecutar algún comando, deberíamos lanzarlo de alguna de las siguientes maneras: comando & disown El ampersand (''&'') hace que el comando se ejecute en segundo plano y ''disown'' lo desvincula de la shell actual (lo quita de su lista de trabajos). La otra opción: nohup comando ''nohup'' separa directamente el proceso de la terminal por lo que al cerrar la terminal, no enviará una señal de detención a sus procesos. * [[https://unix.stackexchange.com/a/148698|Difference between nohup, disown and &]] (StackExchange.com) **Copiar los permisos de un fichero a otro**: chmod --reference fichero1 fichero2 La opción ''%%--%%reference'' también se puede usar con los comandos ''chgrp'' y ''chown'' **Conectarse a un servidor SSH a través de un intermediario**: ssh -t hostA ssh hostB Esto es útil si por ejemplo no tenemos acceso directo a ''hostB'', pero sí a través de ''hostA''. Hacemos todo en un único paso. Aunque se pudiese lograr lo mismo estableciendo un túnel, eso implicaría usar otros puertos (un puerto diferente por túnel) **Mostrar el tamaño de las particiones de disco**: lsblk --json | jq -c '.blockdevices[]|[.name,.size]' Otra opción un poco más rápida y sin usar ''jq'': lsblk | grep -v part | awk '{print $1 "\t" $4}' **Mostrar la distribución Linux instalada**: cat /etc/*release Alternativa básica: cat /etc/issue Si instalamos el programa ''lsb-release'' también podríamos verlo con: lsb_release -a **Obtener la fecha de ayer** Día de ayer usando el comando ''date'' y con la salida formato ''AAAA-MM-DD'': date -d "yesterday 13:00" '+%Y-%m-%d' **Mostrar fecha de inicio de los procesos y duración** ps -eo pid,lstart,etime,args **Ejecutar un programa periódicamente mostrando su salida** watch -n 5 ls -l El comando anterior ejecutaría ''ls -l'' cada 5 segundos. Si además queremos ver qué cambia entre actualizaciones, usaremos la opción ''-d'': watch -d -n 5 ls -l ===== Otros ===== **Cronómetro**: time read Cuando detengamos el proceso con Ctrl + d, se mostrará el tiempo que duró el proceso: real 0m9.688s user 0m0.004s sys 0m0.000s **Mostrar un reloj en la esquina del terminal**: while sleep 1;do tput sc;tput cup 0 $(($(tput cols)-29));date;tput rc;done & Como se ejecuta como un proceso en segundo plano, para "matarlo" tendremos que saber su PID o trar el proceso a primer plano (''fg'') y detenerlo con Ctrl + %%c%% **Lista de comandos que más se han usado**: history | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn | head **Información del tiempo**: curl wttr.in/madrid **Ejecutar un comando un tiempo determinado**: timeout 5s ping www.google.es El anterior comando ejecutará ''ping %%www.google.es%%'' durante 5 segundos y finalizará el proceso. Otra opción podría ser usando ''sleep'': Si queremos que el comando se finalice correctamente (SIGINT), le pasaremos la opción ''-s'': ''timeout -s 2 5s ''. Para ver el listado de señales que le podemos pasar a ''-s'', ''kill -l''. ''timeout'' pertenece a las [[informatica:sistemas_operativos:linux:coreutils|coreutils]]. **Listado de todos los atajos de Bash**: bind -P Si queremos mostrarlo de una forma más "agradable": bind -P | grep -v "is not" | sed -e 's/can be found on/:/' | column -s: -t **Simular que estás trabajando**: Que aparezca una ventana de progreso de una instalación falsa: for i in {0..600}; do echo $i; sleep 1; done | dialog --gauge "Install..." 6 40 Para que funcione el comando anterior es necesario instalar ''dialog'' Hacer que se muestre información hexadecimal desplazándose por la pantalla: while [ true ]; do head -n 100 /dev/urandom; sleep .1; done | hexdump -C | grep "ca fe" **Enviar notificaciones al escritorio**: notify-send "Mensaje" Podríamos hacer cosas como que nos avisase del fin de una descarga por ''wget'': wget https://www.debian.org/example.iso; notify-send "Descarga completada" Otra opción usando ''zenity'': zenity --info --text="Mensaje" **Compartir un fichero por el puerto 80**: nc -v -l 80 < fichero.extension Desde otro equipo que tenga acceso, abrir un navegador web y poner la IP del equipo que está compartiendo el fichero. Necesita tener instalado ''netcat'' **Mostrar la jerarquí del sistema de ficheros Linux**: man hier Muestra información sobre los directorios típicos de un sistema Linux (''/'', ''/bin'', ''/home'', ''/etc''...), qué hay en ellos, para qué sirven... **Guardar la salida de un comando como imagen**: convert label:"$(ip a)" output.png **Abrir editor de texto para escribir un comando largo o complicado**: fc Se abrirá el editor configurado en la variable ''$EDITOR'', podremos escribir el comando que queramos y al guardar y salir, se ejecutará en la línea de comandos. Podemos usar el siguiente atajo de teclado en bash para obtener lo mismo: Ctrl + %%x%% %%e%% (también es válido Ctrl + %%x%% Ctrl + %%e%%) ===== Ficheros ===== **Convertir codificación de caracteres** Si queremos pasar un fichero en ISO-8859-1 a UTF-8 (Unicode): iconv -f iso88591 -t utf8 fichero-iso88591 .txt > fichero-utf8 .txt * ''-f'': codificación de origen * ''-t'': codificación de destino **Eliminar última línea** Para eliminar la última línea/fila de un fichero: sed -i '$d' También podemos hacerlo con ''head'' y luego redirigir la salida a un nuevo fichero que ya no tendrá esa línea final: head -n -1 > * ''-1'': indicamos que la última línea no se muestre en la salida de ''head'' ==== Eliminar x caracteres de cada línea ==== Partiendo de un fichero con: 34616860801 34604079411 34638027751 34666055461 34604067131 34646424621 34687441571 34688784081 34666450101 34604091921 Si queremos quitar los dos primeros caracteres de cada línea: less fichero.txt | cut -c3- ''cut'' coge lo que haya desde la columna 3 (la primera columna es la 1) hasta el final ===== Sistema de ficheros ===== ==== Mover todos los archivos, menos directorios ==== Si queremos mover todos los ficheros, salvo directorios, que hay dentro de un directorio y subdirectorios: find /directorio/origen/ -type f -print0 | xargs -0 mv -t /directorio/destino/ * [[https://askubuntu.com/a/172634|How do I move all files from one folder to another using the command line?]] ===== Recursos ===== * [[https://www.commandlinefu.com/commands/browse|commandlinefu.com]]