====== 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]]