Se añaden scripts de Korn Shell
This commit is contained in:
parent
379798d954
commit
1962204fd7
17 changed files with 1049 additions and 0 deletions
137
varios/ksh/dmenurecord.ksh
Executable file
137
varios/ksh/dmenurecord.ksh
Executable file
|
@ -0,0 +1,137 @@
|
|||
#!/bin/ksh
|
||||
|
||||
# Usage:
|
||||
# `$0`: Ask for recording type via dmenu
|
||||
# `$0 screencast`: Record both audio and screen
|
||||
# `$0 video`: Record only screen
|
||||
# `$0 audio`: Record only audio
|
||||
# `$0 kill`: Kill existing recording
|
||||
#
|
||||
# If there is already a running instance, user will be prompted to end it.
|
||||
|
||||
read -r RES < /sys/class/graphics/fb0/virtual_size
|
||||
|
||||
updateicon() { \
|
||||
print "$1" > /tmp/recordingicon
|
||||
pkill -RTMIN+9 "${STATUSBAR:?}"
|
||||
}
|
||||
|
||||
killrecording() {
|
||||
recpid="$(cat /tmp/recordingpid)"
|
||||
# kill with SIGTERM, allowing finishing touches.
|
||||
kill -15 "$recpid"
|
||||
rm -f /tmp/recordingpid
|
||||
updateicon ""
|
||||
pkill -RTMIN+9 "${STATUSBAR:?}"
|
||||
# even after SIGTERM, ffmpeg may still run, so SIGKILL it.
|
||||
sleep 3
|
||||
kill -9 "$recpid"
|
||||
exit
|
||||
}
|
||||
|
||||
screencast() { \
|
||||
ffmpeg -y \
|
||||
-f x11grab \
|
||||
-framerate 24 \
|
||||
-s "${RES/,/x}" \
|
||||
-i "$DISPLAY" \
|
||||
-f alsa -i default \
|
||||
# -f sndio -i snd/0 \
|
||||
-r 24 -async 1 -vsync -1 \
|
||||
-c:v libx264rgb -crf 0 -preset ultrafast -c:a aac \
|
||||
-preset ultrafast -c:a libvorbis \
|
||||
"$HOME/screencast-$(date '+%y%m%d-%H%M%S').mkv" &
|
||||
print $! > /tmp/recordingpid
|
||||
updateicon "⏺️🎙️"
|
||||
}
|
||||
|
||||
screencastmobile() { \
|
||||
ffmpeg -y \
|
||||
-f x11grab \
|
||||
-framerate 60 \
|
||||
-s "${RES/,/x}" \
|
||||
-i "$DISPLAY" \
|
||||
-f alsa -i default \
|
||||
-r 30 \
|
||||
-c:v libx264 -profile:v baseline -level 3.0 -pix_fmt yuv420p -loglevel panic -c:a aac \
|
||||
"$HOME/screencast-$(date '+%y%m%d-%H%M%S').mp4" &
|
||||
print $! > /tmp/recordingpid
|
||||
updateicon "⏺️🎙️"
|
||||
}
|
||||
|
||||
video() { ffmpeg \
|
||||
-f x11grab \
|
||||
-s "${RES/,/x}" \
|
||||
-i "$DISPLAY" \
|
||||
-c:v libx264 -qp 0 -r 30 \
|
||||
"$HOME/video-$(date '+%y%m%d-%H%M%S').mkv" &
|
||||
print $! > /tmp/recordingpid
|
||||
updateicon "⏺️"
|
||||
}
|
||||
|
||||
videomobile() { \
|
||||
ffmpeg -y \
|
||||
-f x11grab \
|
||||
-framerate 60 \
|
||||
-s "${RES/,/x}" \
|
||||
-i "$DISPLAY" \
|
||||
-r 30 \
|
||||
-c:v libx264 -profile:v baseline -level 3.0 -pix_fmt yuv420p -loglevel panic\
|
||||
"$HOME/video-$(date '+%y%m%d-%H%M%S').mp4" &
|
||||
print $! > /tmp/recordingpid
|
||||
updateicon "⏺️🎙️"
|
||||
}
|
||||
|
||||
webcamhidef() { ffmpeg \
|
||||
-f v4l2 \
|
||||
-i /dev/video0 \
|
||||
-video_size 1920x1080 \
|
||||
"$HOME/webcam-$(date '+%y%m%d-%H%M%S').mp4" &
|
||||
print $! > /tmp/recordingpid
|
||||
updateicon "🎥"
|
||||
}
|
||||
|
||||
webcam() { ffmpeg \
|
||||
-f v4l2 \
|
||||
-i /dev/video0 \
|
||||
-video_size 640x480 \
|
||||
"$HOME/webcam-$(date '+%y%m%d-%H%M%S').mp4" &
|
||||
print $! > /tmp/recordingpid
|
||||
updateicon "🎥"
|
||||
}
|
||||
|
||||
audio() { \
|
||||
ffmpeg \
|
||||
-f alsa -i default \
|
||||
-c:a flac \
|
||||
"$HOME/audio-$(date '+%y%m%d-%H%M%S').mp4" &
|
||||
print $! > /tmp/recordingpid
|
||||
updateicon "🎙️"
|
||||
}
|
||||
|
||||
askrecording() { \
|
||||
choice=$(printf "screencast\\nwebcam\\nscreencastmobile\\nvideomobile" | dmenu -i -sb "#4D4270" \
|
||||
-p "Seleccione el modo de grabación:")
|
||||
case "$choice" in
|
||||
screencast) screencast;;
|
||||
audio) audio;;
|
||||
video) video;;
|
||||
webcam) webcam;;
|
||||
screencastmobile) screencastmobile;;
|
||||
videomobile) videomobile;;
|
||||
esac
|
||||
}
|
||||
|
||||
asktoend() { \
|
||||
response=$(printf "No\\nSí" | dmenu -i -sb "#4D4270" -p "Grabación activa.¿Desea finalizar?") &&
|
||||
[ "$response" = "Sí" ] && killrecording
|
||||
}
|
||||
|
||||
|
||||
case "$1" in
|
||||
screencast) screencast;;
|
||||
audio) audio;;
|
||||
video) video;;
|
||||
kill) killrecording;;
|
||||
*) ([ -f /tmp/recordingpid ] && asktoend && exit) || askrecording;;
|
||||
esac
|
36
varios/ksh/hosts.ksh
Executable file
36
varios/ksh/hosts.ksh
Executable file
|
@ -0,0 +1,36 @@
|
|||
#!/bin/ksh
|
||||
# V0.4
|
||||
# Script para descargar una lista personalizada con direcciones para bloquearlas
|
||||
# a través del fichero hosts. Para automatizar este proceso se recomienda crear
|
||||
# una tarea (crontab) y ajustarla a las necesidades del usuario (diario, semanal
|
||||
# mensual, etc)
|
||||
#
|
||||
# Dependencias: dzen2, wget
|
||||
#
|
||||
# Autor: Tuxliban Torvalds <o-sanchez@linuxmail.org>
|
||||
|
||||
function msg {
|
||||
dzen2 -p '10' -fn 'JetBrains Mono:size=8:style=bold' -ta '5' \
|
||||
-w '260' -x '1100' -y '25'
|
||||
}
|
||||
|
||||
# which_sudo es una función personalizada de ksh
|
||||
SUDO=$(which_sudo)
|
||||
|
||||
# Realizar copia de seguridad del fichero hosts en caso de no existir
|
||||
if [[ ! -f /etc/hosts.bak ]]; then
|
||||
printf '%b' "\033[32;1mCreando copia de seguridad del fichero hosts...\033[0m\n"
|
||||
$SUDO cp /etc/hosts /etc/hosts.bak
|
||||
printf "\033[33;1mCopia finalizada\033[0m\n"
|
||||
else
|
||||
printf '%b' "\033[35;5mYa existe copia de seguridad del fichero hosts\033[0m\n"
|
||||
fi
|
||||
|
||||
# Descargar actualización más reciente del fichero hosts
|
||||
printf '%b' "\033[32;1mDescargando y copiando lista actualizada para fichero hosts...\033[0m\n"
|
||||
$SUDO wget -O /etc/hosts http://sbc.io/hosts/alternates/fakenews-gambling-porn/hosts
|
||||
"$HOME"/.local/bin/dunst_sound 2> /dev/null
|
||||
|
||||
# Notificacion de actualizacion del fichero
|
||||
printf '%b' "\033[36;1mFichero hosts actualizado.\033[0m\n"
|
||||
printf '%s\n' "Lista de fichero hosts actualizado" | msg &
|
30
varios/ksh/kbasename.ksh
Executable file
30
varios/ksh/kbasename.ksh
Executable file
|
@ -0,0 +1,30 @@
|
|||
#!/bin/ksh
|
||||
#
|
||||
# Versión Korn Shell de basename
|
||||
#
|
||||
# Comprobar argumentos
|
||||
if (($# == 0 || $# > 2 )); then
|
||||
printf %s "\
|
||||
Uso: ${0##*/} string [sufijo]
|
||||
Ejemplos:
|
||||
${0##*/} /path/foo.xyz
|
||||
foo.xyz\n
|
||||
|
||||
${0##*/} /path/foo .xyz
|
||||
foo
|
||||
|
||||
"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Obtener el nombre base
|
||||
BASE=${1##*/}
|
||||
|
||||
# Ver si se ha dado el argumento sufijo
|
||||
if (($# > 1 )); then
|
||||
# Mostrar nombre base sin sufijo
|
||||
print ${BASE%$2}
|
||||
else
|
||||
# Mostrar nombre base
|
||||
print $BASE
|
||||
fi
|
33
varios/ksh/kbattery.ksh
Executable file
33
varios/ksh/kbattery.ksh
Executable file
|
@ -0,0 +1,33 @@
|
|||
#!/bin/ksh
|
||||
#
|
||||
# Códigos de salida
|
||||
# 0 Éxito (batería baja)
|
||||
# 3 Suficiente bateria
|
||||
#
|
||||
# Dependencias: dzen2
|
||||
#
|
||||
# Autor: Tuxliban Torvalds <o-sanchez@linuxmail.org>
|
||||
|
||||
read -r capacity < /sys/class/power_supply/BAT0/capacity
|
||||
read -r status < /sys/class/power_supply/BAT0/status
|
||||
|
||||
function dep {
|
||||
if ! command -v dzen2 >/dev/null; then
|
||||
printf '%b\n' "Dependencia no satisfecha:\n\tInstale dzen2\n"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
function msg {
|
||||
dzen2 -p -fn 'JetBrains Mono:size=8:style=bold' -ta 5 \
|
||||
-w 260 -x 1100 -y 25
|
||||
}
|
||||
|
||||
if [[ "$status" == "Discharging" ]]; then
|
||||
if (( capacity <= 25 )); then
|
||||
"$HOME"/Dropbox/Gitea/scripts/varios/dunst_sound 2> /dev/null
|
||||
printf '%s\n' "Batería baja: $capacity%, conectar el cargador" | msg &
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
exit 3
|
28
varios/ksh/kcat.ksh
Executable file
28
varios/ksh/kcat.ksh
Executable file
|
@ -0,0 +1,28 @@
|
|||
#!/bin/ksh
|
||||
#
|
||||
# Version Korn Shell de cat
|
||||
#
|
||||
# Comprobar uso
|
||||
if (($# < 1)); then
|
||||
print "Uso: ${0##*/} <archivo> ..."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Procesar cada fichero
|
||||
while (($# > 0)); do
|
||||
# Asegurarse de que el archivo exista
|
||||
if [[ ! -f $1 ]]; then
|
||||
print "$1: Inexistente o no accesible"
|
||||
else
|
||||
|
||||
# Abrir archivo de entrada
|
||||
exec 0<$1
|
||||
while read LINE; do
|
||||
# Visualización de salida
|
||||
print $LINE
|
||||
done
|
||||
fi
|
||||
|
||||
# Obtener el argumento del siguiente archivo
|
||||
shift
|
||||
done
|
12
varios/ksh/kdirname.ksh
Executable file
12
varios/ksh/kdirname.ksh
Executable file
|
@ -0,0 +1,12 @@
|
|||
#!/bin/ksh
|
||||
#
|
||||
# Versión Korn Shell de dirname
|
||||
#
|
||||
# Comprobar argumentos
|
||||
if (($# ==0 || $# > 1)); then
|
||||
print "Uso: ${0##*/} string"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Obtener el nombre del directorio
|
||||
print ${1%/*}
|
94
varios/ksh/kdocx2.ksh
Executable file
94
varios/ksh/kdocx2.ksh
Executable file
|
@ -0,0 +1,94 @@
|
|||
#!/bin/ksh
|
||||
# Script para convertir documentos de word a PDF o a texto plano usando pandoc
|
||||
#
|
||||
# NOTA: Este script hace uso de la sustitución de parámetros para obtener el nombre del archivo (basename)
|
||||
# y de su respectivo path (dirname). Se aprovecha esta funcionalidad del shell para evitar hacer uso de
|
||||
# comandos externos.
|
||||
# Este script utiliza en su mayoría el parámetro $2 el cual puede ser el archivo que se desea convertir o
|
||||
# también puede ser el directorio donde se encuentran los archivos que se convertirán a formato pdf.
|
||||
#
|
||||
# Equivalencias sustituyendo al parámetro $2:
|
||||
# 1. extensión: ${2##*.}
|
||||
# 2. dirname: ${2%/*}
|
||||
# 3. basename: ${2##*/}
|
||||
# 4. pathfile sin extensión: ${file%.*}
|
||||
#
|
||||
# Dependencias lualatex, pandoc
|
||||
#
|
||||
# Autor: Tuxliban Torvalds <o-sanchez@linuxmail.org>
|
||||
|
||||
|
||||
# Nombre del script usando la sustitución de parámetros
|
||||
script="${0##*/}"
|
||||
|
||||
# Revisar que las dependencias estén instaladas
|
||||
if ! command -v lualatex > /dev/null; then
|
||||
print "Dependencia lualatex no encontrada en el sistema, instalándola..."
|
||||
doas xbps-install -Sy texlive-LuaTeX
|
||||
elif ! command -v pandoc > /dev/null; then
|
||||
print "Dependencia pandoc no encontrada en el sistema, instalándola..."
|
||||
doas xbps-install -Sy pandoc
|
||||
fi
|
||||
|
||||
function ayuda {
|
||||
printf %s "\
|
||||
Nombre: $script
|
||||
Propósito: Convertir documentos docx a formato PDF o texto plano (txt)
|
||||
Autor: Tuxliban Torvalds <o-sanchez@linuxmail.org>
|
||||
Versión: 1.0 (27/04/2023)
|
||||
|
||||
Uso: $script <arg> <directorio o archivo>
|
||||
--pdf | -p Convierte archivo(s) a formato PDF
|
||||
--txt | -t Convierte archivo(s) a texto plano
|
||||
--help | -h Mustra este mensaje de ayuda
|
||||
|
||||
EJEMPLOS: $script --pdf /path/foo.docx Convierte archivo especificado
|
||||
$script -t /path/ Convierte archivos compatibles del directorio especificado a texto plano
|
||||
"
|
||||
}
|
||||
|
||||
case $1 in
|
||||
--pdf|-p)
|
||||
# Si el segundo argumento existe y tiene terminación docx, realizar la conversión del documento
|
||||
# a archivo tipo PDF
|
||||
if [[ -f $2 && ${2##*.} == "docx" ]]; then
|
||||
printf '%s\n' "Convirtiendo $FILENAME a formato PDF..."
|
||||
pandoc "$2" -V geometry:"top=2cm, bottom=1.5cm, left=2.4cm, right=2.4cm" \
|
||||
--pdf-engine=lualatex -o ${2%.*}.pdf
|
||||
exit 0
|
||||
|
||||
# Comprobar que el segundo argumento exista y que se trate de un directorio.
|
||||
elif [[ -d $2 ]]; then
|
||||
# Si en el directorio hay archivos con extensión tipo .docx, convertirlos a archivo tipo PDF
|
||||
for file in "$2"*.docx; do
|
||||
[[ -f $file ]] || continue
|
||||
printf '%s\n' "Convirtiendo ${file##*/} a formato PDF..."
|
||||
pandoc "$file" -V geometry:"top=2cm, bottom=1.5cm, left=2.4cm, right=2.4cm" \
|
||||
--pdf-engine=lualatex -o "${file%.*}".pdf
|
||||
done
|
||||
exit 0
|
||||
else
|
||||
printf '%s' "\nERROR: el fichero o directorio no existe\n"
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
--txt|-t)
|
||||
if [[ -f $2 && ${2##*.} == "docx" ]]; then
|
||||
printf '%s\n' "Convirtiendo $FILENAME a texto plano..."
|
||||
pandoc -s "$2" -t plain -o "${2%.*}".txt --wrap=none
|
||||
exit 0
|
||||
elif [[ -d $2 ]]; then
|
||||
for file in "$2"*.docx; do
|
||||
[[ -f $file ]] || continue
|
||||
printf '%s\n' "Convirtiendo ${file##*/} a formato texto plano..."
|
||||
pandoc "$file" -t plain -o "${file%.*}".txt --wrap=none
|
||||
done
|
||||
exit 0
|
||||
else
|
||||
printf '%s' "\nERROR: el fichero o directorio no existe\n"
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
--help|-h|*)
|
||||
ayuda
|
||||
esac
|
35
varios/ksh/keyboard.ksh
Executable file
35
varios/ksh/keyboard.ksh
Executable file
|
@ -0,0 +1,35 @@
|
|||
#!/bin/ksh
|
||||
# Dependencias: xinput
|
||||
#
|
||||
# Autor: Tuxliban Torvalds <o-sanchez@linuxmail.org>
|
||||
|
||||
script="${0##*/}"
|
||||
|
||||
function ayuda {
|
||||
printf %s "\
|
||||
Script para desactivar teclado interno en portátiles mientras se está en el servidor gráfico.
|
||||
|
||||
Uso: $script [arg]
|
||||
Ejemplo:
|
||||
$script on Activa teclado interno
|
||||
$script off Desactiva teclado interno
|
||||
$script --help, -h Muestra este mensaje de ayuda
|
||||
|
||||
"
|
||||
}
|
||||
|
||||
# Salir si existe un error
|
||||
set -e
|
||||
|
||||
ID=$(xinput --list | awk '/Translated/ {print $7}' | cut -d '=' -f 2)
|
||||
|
||||
case "$1" in
|
||||
on)
|
||||
xinput set-int-prop "$ID" "Device Enabled" 8 1
|
||||
;;
|
||||
off)
|
||||
xinput set-int-prop "$ID" "Device Enabled" 8 0
|
||||
;;
|
||||
--help|-h|*)
|
||||
ayuda
|
||||
esac
|
77
varios/ksh/kimage_ss.ksh
Executable file
77
varios/ksh/kimage_ss.ksh
Executable file
|
@ -0,0 +1,77 @@
|
|||
#!/bin/ksh
|
||||
# v0.2
|
||||
# Dependencias:ImageMagick, xclip, dzen2, xdotool
|
||||
#
|
||||
# Autor: Tuxliban Torvalds <o-sanchez@linuxmail.org>
|
||||
|
||||
script="${0##*/}"
|
||||
|
||||
DIR="$HOME"/Datos/Capturas
|
||||
DATE="$(date +%Y%m%d-%H%M%S)"
|
||||
SUDO=$(which_sudo)
|
||||
|
||||
if ! command -v import > /dev/null; then
|
||||
printf '%b' "\033[31;5m[ERROR] Dependencias no satisfecha. Instalando ImageMagick...\033[0m\n"
|
||||
"$SUDO" xbps-install -y ImageMagick
|
||||
elif ! command -v xclip > /dev/null; then
|
||||
printf '%b' "\033[31;5m[ERROR] Dependencias no satisfecha. Instalando xclip...\033[0m\n"
|
||||
"$SUDO" xbps-install -y xclip
|
||||
elif ! command -v dzen2 > /dev/null; then
|
||||
printf '%b' "\033[31;5m[ERROR] Dependencias no satisfecha. Instalando dzen2...\033[0m\n"
|
||||
"$SUDO" xbps-install -y dzen2
|
||||
elif ! command -v xdotool > /dev/null; then
|
||||
printf '%b' "\033[31;5m[ERROR] Dependencias no satisfecha. Instalando xdotool...\033[0m\n"
|
||||
"$SUDO" xbps-install -y xdotool
|
||||
fi
|
||||
|
||||
function ayuda {
|
||||
printf %s "\
|
||||
Script para realizar capturas de pantalla utilizando ImageMagick.
|
||||
|
||||
Modo de uso:
|
||||
$script [-PsfgSFh]
|
||||
-P Guardar captura de pantalla completa en el portapapeles
|
||||
-s Guardar área seleccionada en el portapapeles
|
||||
-f Guardar captura de pantalla de ventana activa en el portapapeles
|
||||
-g Guardar captura de pantalla completa en el disco duro
|
||||
-S Guardar área seleccionada en el disco duro
|
||||
-F Guardar captura de pantalla de ventana activa en el disco duro
|
||||
--help | -h Mostrar este mensaje de ayuda
|
||||
|
||||
"
|
||||
}
|
||||
|
||||
function msg {
|
||||
dzen2 -p 8 -e 'onstart=uncollapse' -fn 'JetBrains Mono:size=8:style=bold' -ta 5 \
|
||||
-sa c -w 260 -x 1100 -y 25 -l 1
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
-p)
|
||||
import -window root png:- | xclip -t 'image/png' -selection 'clipboard' -i
|
||||
;;
|
||||
-s)
|
||||
sleep 1 && import png:- | xclip -t 'image/png' -selection 'clipboard' -i
|
||||
;;
|
||||
-f)
|
||||
import -window "$(xdotool getwindowfocus)" png:- | xclip -t 'image/png' -selection 'clipboard' -i
|
||||
;;
|
||||
-g)
|
||||
[[ ! -d $DIR ]] || mkdir "$DIR"
|
||||
import -format png -window root "$DIR/$DATE.png"
|
||||
"$HOME"/.local/bin/dunst_sound
|
||||
printf '%s\n' "CAPTURA DE PANTALLA" "Guardando en: ~/Datos/Capturas" | msg &
|
||||
;;
|
||||
-S)
|
||||
[[ ! -d $DIR/Select ]] || mkdir -p "$DIR"/Select
|
||||
sleep 1 && import -format png "$DIR/Select/select-$DATE.png"
|
||||
"$HOME"/.local/bin/dunst_sound
|
||||
printf '%s\n' "ÁREA SELECCIONADA" "Guardando en: ~/Datos/Capturas/select" | msg &
|
||||
;;
|
||||
-F)
|
||||
[[ ! -d $DIR/Select ]] || mkdir -p "$DIR"/Select
|
||||
import -window "$(xdotool getwindowfocus)" -format png "$DIR/Select/window-$DATE.png"
|
||||
;;
|
||||
--help|-h|*)
|
||||
ayuda
|
||||
esac
|
54
varios/ksh/krwallpaper.ksh
Executable file
54
varios/ksh/krwallpaper.ksh
Executable file
|
@ -0,0 +1,54 @@
|
|||
#!/bin/ksh
|
||||
## Script que aleatoriza wallpaper
|
||||
## Dependencias: ImageMagick
|
||||
#
|
||||
# Autor: Tuxliban Torvalds <o-sanchez@linuxmail.org>
|
||||
#
|
||||
# Lista de códigos de salida
|
||||
# 0 - éxito
|
||||
# 10 - Dependencia no satisfecha
|
||||
# 11 - Wallpaper no se modificó
|
||||
|
||||
function deps {
|
||||
if ! command -v magick >/dev/null; then
|
||||
printf '%s\n' "ImageMagick no disponible, instálelo"
|
||||
return 10
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
}
|
||||
|
||||
# Obtener resolución de pantalla
|
||||
read -r RES < /sys/class/graphics/fb0/virtual_size
|
||||
|
||||
# Path wallpapers
|
||||
DIR_WALL="$HOME/Datos/Imágenes/Wallpapers"
|
||||
|
||||
# Obtener una lista de los archivos de imagen en el directorio de wallpapers
|
||||
WALL=("$DIR_WALL"/*.{jpg,jpeg,png})
|
||||
|
||||
# Obtener un número aleatorio entre 0 y la cantidad de archivos de imagen en la lista
|
||||
((RAND_INDEX=RANDOM % ${#WALL[@]}))
|
||||
|
||||
# Obtener el nombre del archivo de imagen seleccionado
|
||||
RAND_IMG="${WALL[$RAND_INDEX]}"
|
||||
|
||||
if deps; then
|
||||
# Comprobar que el archivo seleccionado exista
|
||||
if [[ -f $RAND_IMG ]]; then
|
||||
|
||||
# Si el archivo existe, configurarlo como wallpaper
|
||||
display -resize "!${RES/,/x}" -window root "$RAND_IMG"
|
||||
exit 0
|
||||
else
|
||||
print "El archivo $RAND_IMG no existe."
|
||||
if [[ ! -f $RAND_IMG ]]; then
|
||||
((RAND_INDEX=RANDOM % ${#WALL[@]}))
|
||||
RAND_IMG="${WALL[$RAND_INDEX]}"
|
||||
display -resize "!${RES/,/x}" -window root "$RAND_IMG"
|
||||
fi
|
||||
exit 11
|
||||
fi
|
||||
else
|
||||
exit 10
|
||||
fi
|
138
varios/ksh/ksync_cloud.ksh
Executable file
138
varios/ksh/ksync_cloud.ksh
Executable file
|
@ -0,0 +1,138 @@
|
|||
#!/bin/ksh
|
||||
# v1.3
|
||||
# Script para sincronizar nube remota de dropbpox
|
||||
# Dependencias: rclone, rclonesync, dzen2
|
||||
#
|
||||
# Lista de códigos de salida
|
||||
# 0 - éxito
|
||||
# 9 - operación exitosa, pero no se transfirieron archivos
|
||||
# 10 - error temporal de sincronización
|
||||
# 11 - error por falta de conexión
|
||||
# 12 - error de dependencia
|
||||
# 13 - error no categorizado de otra manera
|
||||
#
|
||||
# Autor: Tuxliban Torvalds <o-sanchez@linuxmail.org>
|
||||
|
||||
|
||||
set -u # salir si una variable no ha sido declarada
|
||||
|
||||
|
||||
########## Verificar que las dependencias estén instaladas ##########
|
||||
|
||||
function deps {
|
||||
if ! command -v rclone >/dev/null; then
|
||||
printf '%b' "\033[31;5m[ERROR] Instale el paquete 'rclone'\033[0m\n"
|
||||
return 12
|
||||
elif ! command -v dzen2 >/dev/null; then
|
||||
printf '%b' "\033[31;5m[ERROR] Instale el paquete 'dzen2'\033[0m\n"
|
||||
return 12
|
||||
# El cliente rclone de forma nativa ya soporta le sincronización bidirecional, por esa razón
|
||||
# las siguiente líneas de código han sido comentadas.
|
||||
|
||||
# elif ! command -v rclonesync >/dev/null; then
|
||||
# printf '%b' "\033[31;5m[ERROR] No está disponible 'rclonesync' en el sistema. Clonado \
|
||||
# repositorio para instalar el ejecutable...\033[0m\n"
|
||||
# git -C /tmp clone https://github.com/cjnaz/rclonesync-V2.git --depth 1
|
||||
# [ -d "$HOME"/.local/bin ] || mkdir -p "$HOME/.local/bin"
|
||||
# cp /tmp/rclonesync-V2/rclonesync "$HOME"/.local/bin
|
||||
# export PATH="$HOME/.local/bin:$PATH"
|
||||
# return 12
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
########## Directorio para base de datos ##########
|
||||
|
||||
WORKDIR="$HOME"/.config/rclone
|
||||
TMPFILE=$(mktemp /tmp/dropbox.XXXXXXXXXX)
|
||||
|
||||
if [[ ! -f $WORKDIR/dropbox.txt ]]; then
|
||||
find "$HOME/Dropbox" -type f -exec md5sum {} \; > "$WORKDIR"/dropbox.txt
|
||||
fi
|
||||
|
||||
|
||||
########## Eliminar algún archivo residual que pudiera haber quedado ##########
|
||||
|
||||
for FILE in /tmp/dropbox*; do
|
||||
[[ -f $FILE ]] || continue
|
||||
rm "$FILE"
|
||||
done
|
||||
|
||||
|
||||
########## Sincronizar nube remota ##########
|
||||
|
||||
function check_diff {
|
||||
find "$HOME/Datos/Dropbox" -type f -exec md5sum {} \; > "$TMPFILE"
|
||||
DIFF=$(diff -q "$WORKDIR/dropbox.txt" "$TMPFILE")
|
||||
if [[ -z $DIFF ]]; then
|
||||
return 9
|
||||
fi
|
||||
}
|
||||
|
||||
# Rclone ya integra de forma nativa la sincronizacion bidireccional
|
||||
#function sync {
|
||||
# rclonesync "$HOME"/Dropbox MiDropbox: --check-access --check-filename=RCLONE_TEST \
|
||||
# --filters-file "$HOME"/.config/rclone/Filtro.txt --rclone-args --copy-links \
|
||||
# --multi-thread-streams=14 --transfers=14 >> "$HOME"/.config/rclone/log 2>&1
|
||||
#}
|
||||
|
||||
#function first_sync {
|
||||
# rclonesync "$HOME"/Dropbox MiDropbox: --first-sync --check-access --check-filename=RCLONE_TEST \
|
||||
# --filters-file "$HOME"/.config/rclone/Filtro.txt --rclone-args --copy-links \
|
||||
# --multi-thread-streams=14 --transfers=14 >> "$HOME"/.config/rclone/log 2>&1
|
||||
#}
|
||||
|
||||
function first_sync {
|
||||
/usr/bin/rclone bisync "$HOME"/Dropbox MiDropbox: --resync --check-access --check-filename=RCLONE_TEST \
|
||||
--filters-file "$HOME"/.config/rclone/Filtro.txt --remove-empty-dirs --color AUTO --copy-links \
|
||||
--multi-thread-streams=4 --transfers=8 --log-file "$HOME"/.config/rclone/dropbox.log 2>&1
|
||||
}
|
||||
|
||||
function sync {
|
||||
/usr/bin/rclone bisync "$HOME"/Dropbox MiDropbox: --check-access --check-filename=RCLONE_TEST \
|
||||
--filters-file "$HOME"/.config/rclone/Filtro.txt --remove-empty-dirs --color AUTO --copy-links \
|
||||
--multi-thread-streams=4 --transfers=8 --log-file "$HOME"/.config/rclone/dropbox.log 2>&1
|
||||
}
|
||||
|
||||
function msg {
|
||||
dzen2 -p 8 -e 'onstart=uncollapse' -fn 'JetBrains Mono:size=8:style=bold' -ta c \
|
||||
-sa c -w 260 -x 1100 -y 25 -l 1
|
||||
}
|
||||
|
||||
|
||||
if deps; then
|
||||
if check_diff; then
|
||||
if ping -A -c 3 1.1.1.1 >/dev/null; then
|
||||
if sync; then
|
||||
print "Dropbox sincronizado" | msg &
|
||||
print "Dropbox sincronizado"
|
||||
mv "$TMPFILE" "$WORKDIR/dropbox.txt"
|
||||
exit 0
|
||||
else
|
||||
first_sync
|
||||
print "Dropbox sincronizado" | msg &
|
||||
print "Dropbox sincronizado"
|
||||
exit 10
|
||||
fi
|
||||
elif [[ $(ping -A -c 3 1.1.1.1 >/dev/null) == 1 ]]; then
|
||||
printf '%s\n' "No se pudo sincronizar Dropbox" "Sin conexión a internet" | msg &
|
||||
print "No se pudo sincronizar Dropbox. Sin conexión a internet\\n"
|
||||
rm "$TMPFILE"
|
||||
exit 11
|
||||
else
|
||||
rm "$TMPFILE"
|
||||
printf '%s\n' "Ocurrieron errores" "Revisar el log" | msg &
|
||||
print "Ocurrieron errores. Revisar el log\\n"
|
||||
exit 13
|
||||
fi
|
||||
else
|
||||
rm "$TMPFILE"
|
||||
print "Operación exitosa, pero no se transfirieron archivos\\n"
|
||||
exit 9
|
||||
fi
|
||||
fi
|
||||
|
||||
print "ERROR: Dependencias no satisfechas. Este script requiere tener instalado:"
|
||||
#print "\\trclone\\n" "\\trclonesync\\n" "\\tdzen2\\n"
|
||||
print "\\trclone\\n" "\\tdzen2\\n"
|
||||
exit 12
|
49
varios/ksh/kupdates-void.ksh
Executable file
49
varios/ksh/kupdates-void.ksh
Executable file
|
@ -0,0 +1,49 @@
|
|||
#!/bin/ksh
|
||||
# Script que revisa si existen actualizaciones disponibles para el sistema
|
||||
# Dependencas: dzen2
|
||||
#
|
||||
# Lista de códigos de salida
|
||||
# 0 - Operación exitosa
|
||||
# 1 - Dependencia no cumplida
|
||||
# 3 - Paquetes rotos
|
||||
# 4 - Operación exitosa, pero no hubo cambios
|
||||
#
|
||||
# NOTA: count_lines es una función personalizada de ksh
|
||||
#
|
||||
# Autor: Tuxliban Torvalds <o-sanchez@linuxmail.org> 2022 - 2023
|
||||
|
||||
TMP_UPDATES=$(mktemp -d /tmp/updates_void.XXXX)
|
||||
xbps-install -nuM 1>${TMP_UPDATES}/updates 2>${TMP_UPDATES}/error
|
||||
UPDATES="$(count_lines ${TMP_UPDATES}/updates)"
|
||||
BROKEN="$(< ${TMP_UPDATES}/error)"
|
||||
PKGS="$(awk '{printf "%-25s %s\n", $1, $2}' ${TMP_UPDATES}/updates)"
|
||||
|
||||
|
||||
function deps {
|
||||
if ! command -v dzen2 >/dev/null; then
|
||||
printf '%b\n' "Dependencia no satisfecha:\n\tInstale dzen2\n"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
function msg {
|
||||
dzen2 -p -fn 'JetBrains Mono:size=8:style=bold' -ta 5 \
|
||||
-w 260 -x 1100 -y 25 -l 10
|
||||
}
|
||||
|
||||
if deps; then
|
||||
if [[ -z $BROKEN && -n $UPDATES ]]; then
|
||||
"$HOME"/Dropbox/Gitea/scripts/varios/dunst_sound 2> /dev/null
|
||||
printf '%s\n' "ACTUALIZACIONES DISPONIBLES: $UPDATES" "$PKGS" | msg &
|
||||
rm -r ${TMP_UPDATES}
|
||||
exit 0
|
||||
elif [[ -n $BROKEN ]]; then
|
||||
printf '%s\n' "HAY PAQUETES ROTOS" "$(awk '{printf "%-30s %s\n", $1, $5}' \
|
||||
${TMP_UPDATES}/error)" | msg &
|
||||
rm -r ${TMP_UPDATES}
|
||||
exit 3
|
||||
else
|
||||
[[ -z $UPDATES ]] || rm -r ${TMP_UPDATES}
|
||||
exit 4
|
||||
fi
|
||||
fi
|
71
varios/ksh/kusb.ksh
Executable file
71
varios/ksh/kusb.ksh
Executable file
|
@ -0,0 +1,71 @@
|
|||
#!/bin/ksh
|
||||
#usb v2.1
|
||||
# Dependencias: udevil, dzen2
|
||||
#
|
||||
# Autor: Tuxliban Torvalds <o-sanchez@linuxmail.org>
|
||||
|
||||
script="${0##*/}"
|
||||
|
||||
function ayuda {
|
||||
printf %s "\
|
||||
Script para montar y desmontar dispositivos a través de devmon
|
||||
|
||||
Modo de uso:
|
||||
|
||||
$script [-muUh]
|
||||
|
||||
Opciones:
|
||||
-m Montar dispositivo extraible
|
||||
-u Desmontar dispositivo extraible
|
||||
-U Desmontar último pendrive insertado
|
||||
-h Mostrar ayuda
|
||||
|
||||
"
|
||||
}
|
||||
|
||||
SUDO=$(which_sudo)
|
||||
|
||||
function do_install {
|
||||
if [ "$SUDO" == su ]; then
|
||||
su root -c 'xbps-install "$@"' -- sh "$@"
|
||||
else
|
||||
$SUDO xbps-install "$@"
|
||||
fi
|
||||
}
|
||||
|
||||
if ! command -v udevil >/dev/null; then
|
||||
printf '%b' "\033[31;5m[ERROR] No se encontró instalado el paquete 'udevil'\033[0m\n"
|
||||
printf '%b' "\033[31;1mPreparándose para instalar el paquete 'udevil'...\033[0m\n"
|
||||
do_install -Sy udevil
|
||||
elif ! command -v dzen2 >/dev/null; then
|
||||
printf '%b' "\033[31;5m[ERROR] No se encontró instalado el paquete 'udevil'\033[0m\n"
|
||||
printf '%b' "\033[31;1mPreparándose para instalar el paquete 'udevil'...\033[0m\n"
|
||||
do_install -Sy dzen2
|
||||
fi
|
||||
|
||||
function msg {
|
||||
dzen2 -p 8 -e 'onstart=uncollapse' -fn 'JetBrains Mono:size=8:style=bold' -ta c \
|
||||
-sa c -w 260 -x 1100 -y 25 -l 1
|
||||
}
|
||||
|
||||
case $1 in
|
||||
-m)
|
||||
# Montar dispositivo extraible
|
||||
devmon --sync --exec-on-device %f "printf '%s\n' 'Dispositivo USB' 'Listo para usarse'" | msg &
|
||||
break
|
||||
;;
|
||||
-u)
|
||||
# Desmontar dispositivo
|
||||
devmon --unmount /media/"$USER"/* && pkill -9 udevil
|
||||
sleep 2; printf '%s\n' "DISPOSITIVO USB" "Puede retirarlo con seguridad" | msg &
|
||||
break
|
||||
;;
|
||||
-U)
|
||||
# Desmontar último pendrive insertado
|
||||
devmon --unmount-recent && sleep 2; printf '%s\n' "DISPOSITIVO USB" "Puede retirarlo con seguridad" | msg &
|
||||
break
|
||||
;;
|
||||
-h|--help|*)
|
||||
ayuda
|
||||
esac
|
||||
exit 0
|
14
varios/ksh/kvolume.ksh
Executable file
14
varios/ksh/kvolume.ksh
Executable file
|
@ -0,0 +1,14 @@
|
|||
#!/bin/ksh
|
||||
# Script que muestra el porcentaje activo del volumen del sistema
|
||||
# Dependencias: alsa-utils
|
||||
#
|
||||
# Autor: Tuxliban Torvalds <o-sanchez@linuxmail.org>
|
||||
|
||||
STATUS=$(amixer get Master | awk -F'[][]' 'END{ print $6 }')
|
||||
LEVEL=$(amixer get Master | awk -F'[][]' 'END{ print $2 }')
|
||||
|
||||
if [[ $STATUS == on ]]; then
|
||||
print "VOL $LEVEL"
|
||||
else
|
||||
print "VOL mute"
|
||||
fi
|
67
varios/ksh/kxpkglocal.ksh
Executable file
67
varios/ksh/kxpkglocal.ksh
Executable file
|
@ -0,0 +1,67 @@
|
|||
#!/bin/ksh
|
||||
# Script para consultar el sitio de origen del paquete (upstream) en busca de nuevas versiones.
|
||||
# Se recomienda añadir este script en una tarea de crontab
|
||||
# Dependencias: xbps-src, xtools, dzen2
|
||||
#
|
||||
# Autor: Tuxliban Torvalds <o-sanchez@linuxmail.org>
|
||||
|
||||
set -u
|
||||
|
||||
TMP_DIR=$(mktemp -d /tmp/xpkglocal.XXXXX)
|
||||
SUDO=$(which_sudo)
|
||||
|
||||
|
||||
function do_install {
|
||||
if [[ $SUDO == su ]]; then
|
||||
su root -c 'xbps-install "$@"' -- sh "$@"
|
||||
else
|
||||
"$SUDO" xbps-install "$@"
|
||||
fi
|
||||
}
|
||||
|
||||
function msg {
|
||||
dzen2 -p -fn 'JetBrains Mono:size=8:style=bold' -ta 5 \
|
||||
-w 260 -x 1100 -y 25 -l 20
|
||||
}
|
||||
|
||||
|
||||
# Verificar que las dependencias estén instaladas
|
||||
if ! command -v xpkg >/dev/null; then
|
||||
printf '%s\n' "Instalando paquete xtools"
|
||||
do_install -Sy xtools
|
||||
elif ! command -v dzen2 > /dev/null; then
|
||||
printf '%s\n' "Instalando paquete dzen2"
|
||||
do_install -Sy dzen2
|
||||
fi
|
||||
|
||||
if [ ! -f "$HOME"/void-packages/xbps-src ]; then
|
||||
printf '%s\n' "No se encontró repositorio git de Void Linux. Clonadolo..."
|
||||
git -C "$HOME" clone --depth=1 https://github.com/void-linux/void-packages.git
|
||||
cd "$HOME"/void-packages || exit
|
||||
./xbps-src binary-bootstrap
|
||||
print XBPS_ALLOW_RESTRICTED=yes >> etc/conf
|
||||
fi
|
||||
|
||||
# Crear lista de actualizaciones disponibles
|
||||
:> "${TMP_DIR}"/releases
|
||||
cd "$HOME"/void-packages || exit
|
||||
|
||||
for package in $(xpkg -m); do
|
||||
./xbps-src update-check "$package" | tail -n 1 | tee -a "${TMP_DIR}"/releases > /dev/null
|
||||
done
|
||||
|
||||
uniq "${TMP_DIR}"/releases > "${TMP_DIR}"/upstream_releases
|
||||
|
||||
|
||||
UPDATES="$(count_lines ${TMP_DIR}/upstream_releases)"
|
||||
RELEASES="$(awk '{printf "%-25s %s\n", $1, $3}' ${TMP_DIR}/upstream_releases)"
|
||||
|
||||
if [[ -n $UPDATES ]]; then
|
||||
print "$RELEASES"
|
||||
printf '%s\n' "ACTUALIZACIONES EN UPSTREAM: $UPDATES" "$RELEASES" | msg &
|
||||
rm -r ${TMP_DIR}
|
||||
exit 0
|
||||
else
|
||||
rm -r ${TMP_DIR}
|
||||
fi
|
||||
|
68
varios/ksh/merge-video.ksh
Executable file
68
varios/ksh/merge-video.ksh
Executable file
|
@ -0,0 +1,68 @@
|
|||
#!/bin/ksh
|
||||
#
|
||||
# NOTA: este script aún está en fase de pruebas
|
||||
# Convertir audio ogg a aac
|
||||
# ffmpeg -i input.ogg -strict experimental -acodec aac output.aac
|
||||
#
|
||||
# Añadir audio a video
|
||||
# ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a copy videoconaudio.mp4
|
||||
#
|
||||
# Cortar video
|
||||
# Con -ss estoy indicando que tome el video a partir del minuto 00:05:10 y luego
|
||||
# con -to 00:15:30 indico que relice un corte de video con duración de 10 minutos
|
||||
# y 20 segundos
|
||||
# ffmpeg -i input.mp4 -ss 00:05:10 -to 00:15:30 -c:v copy -c:a copy output2.mp4
|
||||
#
|
||||
# Para quitar audio a un video hacerlo del siguiente modo:
|
||||
# ffmpeg -i $input_file -c copy -an $output_file
|
||||
#
|
||||
# Para unir videos primero crear un archivo de texto con el nombre de los videos a unir:
|
||||
# vim lista.txt
|
||||
# file 1.mp4
|
||||
# file 2.mp4
|
||||
#
|
||||
# Unir los videos:
|
||||
# ffmpeg -f concat -i lista.txt -c copy output.mp4
|
||||
#
|
||||
# Dependencias: ffmpeg, find
|
||||
#
|
||||
# Autor: Tuxliban Torvalds <o-sanchez@linuxmail.org>
|
||||
|
||||
script="${0##*/}"
|
||||
|
||||
function ayuda {
|
||||
printf %s "\
|
||||
Modo de uso: $script [OPCIÓN] [FICHERO, /path]
|
||||
|
||||
Ejemplos:
|
||||
$script -c /path/file START END
|
||||
$script --merge /path
|
||||
|
||||
Selección e interpretación de opciones:
|
||||
-c, --cut Crea un clip cuya duaración estará basada en el punto de inicio y el punto final que
|
||||
se indique del video de origen.
|
||||
-m, --merge Fusiona audio y video
|
||||
-h, --help Muestra esta ayuda y sale.
|
||||
|
||||
NOTA: Los argumentos START y END espeficarlos en formato de tiempo, ejemplo: 00:10:15 (horas, minutos y segundos)
|
||||
|
||||
"
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
--cut|-c)
|
||||
ffmpeg -i "$2" -ss "$3" -to "$4" -c:v copy -c:a copy "$(date '+%y%m%d_%H%M%S').mp4"
|
||||
;;
|
||||
--merge|-m)
|
||||
if [[ -n $(count $2/*.oga) && -n $(count $2/*.mp4) ]]; then
|
||||
cd $2 || exit
|
||||
mv ./*.oga input.oga && mv video*.mp4 input.mp4
|
||||
|
||||
ffmpeg -i input.oga -strict experimental -acodec aac audio.aac
|
||||
ffmpeg -i input.mp4 -i audio.aac -c:v copy -c:a copy "$(date '+%y%m%d_%H%M%S').mp4"
|
||||
mv input.* audio.aac "$HOME"/.local/share/Trash/files
|
||||
fi
|
||||
;;
|
||||
--help|-h|*)
|
||||
ayuda
|
||||
esac
|
106
varios/ksh/purge_pkgs.ksh
Executable file
106
varios/ksh/purge_pkgs.ksh
Executable file
|
@ -0,0 +1,106 @@
|
|||
#!/bin/ksh
|
||||
#
|
||||
# Script que elimina paquetes de la caché que ya no están instalados en el sistema
|
||||
#
|
||||
# NOTA: En caso de usar doas, es necesario que en el archivo de configuración se
|
||||
# tenga configurada la persistencia, de lo contrario por cada archivo por eliminar
|
||||
# será necesario confirmar introduciendo lo contraseña.
|
||||
#
|
||||
# Lista de códigos de salida
|
||||
# 0 - éxito
|
||||
# 9 - operación exitosa, pero no se encontraron archivos para eliminar
|
||||
# 10 - operación exitosa, pero no se eliminaron los archivos encontrados
|
||||
# 11 - respuesta seleccionada inválida
|
||||
# 12 - mensaje de ayuda mostrado
|
||||
#
|
||||
# Autor: Tuxliban Torvalds <o-sanchez@linuxmail.org>
|
||||
|
||||
script="${0##*/}"
|
||||
|
||||
function ayuda {
|
||||
printf %s "\
|
||||
$script ayuda a eliminar definitivamente aquellos paquetes que quedan guardados en la caché del sistema.
|
||||
|
||||
Modo de uso:
|
||||
$script <argumento>
|
||||
|
||||
--list | -l Muestra una lista de los paquetes que la no están en uso
|
||||
--help | -h Muestra este mensaje de ayuda
|
||||
|
||||
"
|
||||
}
|
||||
|
||||
# Identificar cómo escalar permisos de administrador
|
||||
function admin {
|
||||
if command -v sudo >/dev/null && sudo -l | grep -q -e ' ALL$' -e xbps-install; then
|
||||
print sudo
|
||||
elif command -v doas >/dev/null && [ -f /etc/doas.conf ]; then
|
||||
print doas
|
||||
elif [[ $(id -u) != 0 ]]; then
|
||||
print su
|
||||
fi
|
||||
}
|
||||
|
||||
cache_dir=/var/cache/xbps
|
||||
_arch=$(xbps-uhelper arch) # Obtener arquitectura
|
||||
|
||||
function lista {
|
||||
# Obtener lista de paquetes instalados en el sistema
|
||||
xbps-query -l | awk '{print $2}' > /tmp/installed.txt
|
||||
|
||||
# Obtener lista de paquetes en la caché del sistema
|
||||
for package in /var/cache/xbps/*.xbps; do
|
||||
base=${package##*/}
|
||||
print "${base%."$_arch".xbps}"
|
||||
done > /tmp/cache.txt
|
||||
_diff=$(diff /tmp/cache.txt /tmp/installed.txt | awk '/</ {print $2}')
|
||||
|
||||
if [[ -n $_diff ]]; then
|
||||
# Mostrar lista de paquetes que no están en la caché y que no se encuentran instalados
|
||||
printf '%s\n\n' "Los siguiente paquetes ya no se encuentran instalados en el sistema:"
|
||||
printf '%s\n' $_diff | column
|
||||
else
|
||||
printf '%s\n\n' "No hay paquetes por eliminar"
|
||||
exit 9
|
||||
fi
|
||||
}
|
||||
|
||||
case $1 in
|
||||
-l|--list)
|
||||
lista
|
||||
printf '\n%s\n' "¿Deseas eliminar los paquetes? s/n"
|
||||
read -r respuesta
|
||||
|
||||
case "$respuesta" in
|
||||
[sS])
|
||||
diff /tmp/cache.txt /tmp/installed.txt | awk '/</ {print $2}' > /tmp/delete.txt
|
||||
print "Ingrese la contraseña de administrador:"
|
||||
print "Eliminando los paquetes..."
|
||||
while read -r pkg; do
|
||||
cmd=$(admin)
|
||||
if [ "$cmd" = "sudo" ]; then
|
||||
sudo rm -fv "${cache_dir}/${pkg}.${_arch}.xbps"
|
||||
elif [ "$cmd" = "doas" ]; then
|
||||
doas rm -fv "${cache_dir}/${pkg}.${_arch}.xbps"
|
||||
elif [ "$cmd" = "su" ]; then
|
||||
su -c "rm -fv ${cache_dir}/${pkg}.${_arch}.xbps"
|
||||
fi
|
||||
done < /tmp/delete.txt
|
||||
rm -f /tmp/*.txt
|
||||
exit 0
|
||||
;;
|
||||
[nN])
|
||||
rm -f /tmp/*.txt
|
||||
exit 10
|
||||
;;
|
||||
*)
|
||||
print "Respuesta inválida."
|
||||
rm -f /tmp/*.txt
|
||||
exit 11
|
||||
esac
|
||||
;;
|
||||
-h|--help|*)
|
||||
ayuda
|
||||
exit 12
|
||||
esac
|
||||
|
Loading…
Reference in a new issue