Page 1 sur 1

[script] partagez vos créations !

Publié : jeu. 30 janv. 2014, 00:45
par z3bra
Salut la communauté !

Je crée ce thread pour que chacun puisse partager le dernier script qu'il a créé pour se simplifier la vie, faire des trucs marrant au quoi que ce soit.
Il me semble pas avoir trouvé de sujet similaire sur le forum (j'en suis d'ailleurs étonné!), mais n'hésitez pas à me corriger dans le cas contraire.

Enfin trève de bavardages, je commence avec ces quelques scripts:

instagram.sh - Utilitaire d'aide à la prise de screenshot
(La prise en compte des gif est un peu foireuse)

Code : Tout sélectionner

#!/bin/bash
#
# 2013 Willy 'z3bra' Goiffon <willy at mailoo dot org>
#
# INSTAGRAM - screenshot taker / manager
#
# Licensed under WTFPL 2.0
#
# >> http://www.wtfpl.net/txt/copying/
#

IMAGE_DIR=~/usr/img       # répertoire contenant les images
EXEC_UPLOAD=~/bin/upload  # script utilisé pour uploader un fichier
SSHOT_DIR=${IMAGE_DIR}/wm # répertoire final du screenshot
VIEWER=meh                # image viewer

function usage() {
    cat <<SHBLAH
Usage : instagram [-tmuwh] [-g number] [-s screen] [filename.png]
    -t          : create thumbnail
    -m          : create one shot per head
    -u          : upload the file using $EXEC_UPLOAD <filename>
    -w          : take only a window for the shot (choose with pointer)
    -h          : display this help
    -d path     : save the shot in <path>
    -g          : create a gif (press ctrl-C to stop)
    -s screen   : use only the screen number <screen> for the shot

Also, do not give path to shot. They're saved to $SSHOT_DIR by default.

Configuration:
    IMAGE_DIR   : Where images are stored
    SSHOT_DIR   : Where to save your shots
    EXEC_UPLOAD : Path to the script/program used to upload your shot
    VIEWER      : Program used to view the screenshot
SHBLAH
}

function upload() {
    $EXEC_UPLOAD $1
}

[[ "$1" = "--help" ]] && usage && exit 0

# default window id
WINDOW='root'

while getopts ":htmuwd:gs:" opt; do
    case $opt in
        t) THUMB=1 ;;
        m) MULTI=1 ;;
        d) SSHOT_DIR=$OPTARG ;;
        g) GIF=1 ;;
        s) SCREEN=$OPTARG ;;
        u) UPLOAD=1 ;;
        w) WINDOW=$(xprop|grep 'window id'|cut -d\  -f7);;
        h) usage; exit 0;;
        ?) echo "invalid option: -$OPTARG"; exit 1 ;;
    esac
done

shift $((OPTIND-1))

if [[ -z "$1" ]]; then
    OUTPUT="$USER-$(date +%Y-%m-%d).png"
else
    OUTPUT=$1
fi

if [[ "$MULTI" = "1" ]] || [[ -n $SCREEN ]]; then

    xdpyinfo -ext XINERAMA | sed '/^  head #/!d;s///' |
    while IFS=' :x@,' read i w h x y; do
        if [[ $SCREEN = "$i" ]] || [[ -z $SCREEN ]]; then
            import -window ${WINDOW} -crop ${w}x$h+$x+$y $SSHOT_DIR/head_$i-$OUTPUT
            [[ -n $THUMB ]] && import -window ${WINDOW} -thumbnail 25% -crop ${w}x$h+$x+$y $SSHOT_DIR/thumb-head_$i-$OUTPUT
        fi
    done

elif [ -n "$GIF" ]; then
    mkdir $SSHOT_DIR/tmp
    ffmpeg -f x11grab -s 1440x900 -r 25 -i :0.0 $SSHOT_DIR/tmp/out.mov
    ffmpeg -i $SSHOT_DIR/tmp/out.mov -r 1 -f image2 $SSHOT_DIR/tmp/%05d.jpg
    convert -delay 100 $SSHOT_DIR/tmp/*.jpg $SSHOT_DIR/${OUTPUT}
    rm -rf $SSHOT_DIR/tmp
else
    import -window ${WINDOW} $SSHOT_DIR/$OUTPUT
    [[ -n $THUMB ]] && import -window ${WINDOW} -thumbnail 25% $SSHOT_DIR/thumb-${OUTPUT}
fi

if [[ "$UPLOAD" = "1" ]]; then
    cd ${IMAGE_DIR}
    upload wm/${OUTPUT}
fi

$VIEWER $SSHOT_DIR/$OUTPUT
Et un tout neuf qui est le sujet du dernier post de mon blog.
Il permet de voir ses images dans son terminal grâve à w3m (trop cool!)

Code : Tout sélectionner

#!/bin/bash
#
# z3bra -- 2014-01-21

test -z "$1" && exit

W3MIMGDISPLAY="/usr/lib/w3m/w3mimgdisplay"
FILENAME=$1
FONTH=14 # Size of one terminal row
FONTW=8  # Size of one terminal column
COLUMNS=`tput cols`
LINES=`tput lines`

read width height <<< `echo -e "5;$FILENAME" | $W3MIMGDISPLAY`

max_width=$(($FONTW * $COLUMNS))
max_height=$(($FONTH * $(($LINES - 2)))) # substract one line for prompt

if test $width -gt $max_width; then
    height=$(($height * $max_width / $width))
    width=$max_width
fi
if test $height -gt $max_height; then
    width=$(($width * $max_height / $height))
    height=$max_height
fi

w3m_command="0;1;0;0;$width;$height;;;;;$FILENAME\n4;\n3;"

tput cup $(($height/$FONTH)) 0
echo -e $w3m_command|$W3MIMGDISPLAY
Et puis allez, en bonus, un petit soft en C qui va retourner le nombre de fichiers dans un dossier (un genre de ls -lA|wc -l). Je m'en sers pour récupérer le nombre de mails non-lus dans un dossier spécifique

Code : Tout sélectionner

/*
 * mcount.c -- z3bra 2013 <willy at mailoo dot org>
 *
 * Opens a directory and output the number of file found in this directory.
 * Usefull to watch the number of mails in a folder and output it to a status 
 * bar.
 *
 */
#include<stdio.h>
#include<stdlib.h>
#include<dirent.h>
#include<string.h>
#include<errno.h>

int main(int argc, char **argv)
{
    int count = 0;
    DIR* rep = NULL;
    struct dirent *readFile = NULL;

    if (argc > 1) {
        rep = opendir(argv[1]);
    } else {
        fprintf(stderr, "usage: %s <directory>\n", argv[0]);
        exit(1);
    }

    if(rep != NULL) {

        while( (readFile = readdir(rep)) != NULL){
            if(strcmp(readFile->d_name, ".") && strcmp(readFile->d_name, "..")){
                count++;
            }
        }

        if(closedir(rep) == -1){
            exit (-1);
        }
    } else {
        switch (errno) {
            case EACCES:
                fprintf(stderr,"bad permissions : %s/\n", argv[1]);
                break;
            case ENOTDIR:
                fprintf(stderr, "not a directory : %s.\n", argv[1]);
                break;
            default:
                fprintf(stderr, "erreur #%d\n",errno);
        }
    }

    fprintf(stdout, "%u\n",count);
    return 0;
}
En espérant découvrir de nouveaux scripts bien sympa, à vous !

Re: [script] partagez vos créations !

Publié : jeu. 30 janv. 2014, 09:54
par FoolEcho
Salut,
z3bra a écrit :Je crée ce thread pour que chacun puisse partager le dernier script qu'il a créé pour se simplifier la vie, faire des trucs marrant au quoi que ce soit.
Il me semble pas avoir trouvé de sujet similaire sur le forum (j'en suis d'ailleurs étonné!), mais n'hésitez pas à me corriger dans le cas contraire.
Ben... probablement parce que les règles du forum font que les sujets un peu fourre-tout sont très encadrés. :copain:
z3bra a écrit :Et puis allez, en bonus, un petit soft en C qui va retourner le nombre de fichiers dans un dossier (un genre de ls -lA|wc -l).
D'ailleurs, si tu intitules ton sujet «script» et que tu commences à causer C, à mon avis, ça ne va pas trop le faire. :humour: :pastaper: :merci:

:P

Re: [script] partagez vos créations !

Publié : jeu. 30 janv. 2014, 10:54
par z3bra
#!/usr/bin/tcc -run,et hop . un script en C :-)

Re: [script] partagez vos créations !

Publié : dim. 15 juin 2014, 07:55
par Maximilien LIX
Et bien merci z3bra pour ton script permettant d'afficher une image dans un terminal , franchement j'adore ! :-)
En tout cas il va me servir

Re: [script] partagez vos créations !

Publié : dim. 20 juil. 2014, 16:28
par yuno
Si ton programme C fait la même chose que ls avec des paramètres particuliers, pourquoi ne pas avoir fait tout simplement un alias? :)
Sinon je vais me pencher sur ton script qui affiche des images, je vais aussi voir ce qu'est w3m (je ne connaissais pas)

Alors pour ma part, un petit script que j'ai fais pour déconner entre amis au cdi du lycée:

Code : Tout sélectionner

#!/bin/bash

i=-1
increment=0

while [ 1 ] 
do
	if [ $i -lt -10 ]; then
		increment=1
	else
		if [ $i -gt 10 ]; then
			increment=0
      		fi 
      	fi
	
	
	if [ $increment = 1 ]; then
	  let "i+=1"
	else
	  let "i-=2"
	fi

	xrandr --output LVDS1 --brightness $i
	sleep 0.3

done
Pour annuler l'effet, il suffit de taper xrandr --output LVDS1 --brightness 1 et aussi.. Adaptez "LVDS1" selon votre écran: je ne me souviens plus de quel commande il faut taper pour savoir quoi mettre :/



Ensuite, j'ai un autre script qui me simplifie la vie pour la création de projets en C ou en C++. En effet, j'en avais trop marre de toujours devoir écrire un Makefile (ou de le copier/coller d'aileurs) alors j'ai fais ce script pour automatiser la chose.
Fonctionnement: Dans $HOME j'ai créé un dossier appelé .fap (j'ai appelé ce script fap). Dans celui-ci, il y a différents dossier: chacun est un type de projet.

Par exemple, ~/.fap/c/ contient un main.c de base avec un Makefile à côté
~/.fap/cpp/ contient la même chose mais pour le C++
~/fap/sfml/ contient un patron de projet utilisant la sfml (C++)
etc, etc..

Voici le script:

Code : Tout sélectionner

#!/bin/bash

while [ ! -z $1 ] 
do
	if [ -d $HOME/.fap/$1 ] 
	then
		dossier=$1

		liste=`ls $HOME/.fap/$dossier`

		for fichier in $liste
		do
			cp -ir $HOME/.fap/$dossier/$fichier ./
		done
	
      	else
		echo "~/.fap/$1 n'est pas un dossier"
	fi

	shift #On passe au paramètre suivant
done
Ne me tapez pas trop sur les doigts si il est mal fait, je ne maitrise pas ducoup le bash :roll:

D'ailleurs, .bash_aliases si vous le désirez:

Code : Tout sélectionner

#Programmation
alias lsc='ls *.h; echo -e "\n"; ls *.c'
alias lsp='ls *.h; echo -e "\n"; ls *.cpp'


#Archives
alias untar="tar -xvf"
alias mktar="tar -xcf"

#Actions relatifs aux dossiers
alias cd..="cd .."

mkcd()
{
	mkdir $1 && cd $1
}

fapd()
{
	mkcd $1 && fap $2
}
alias fapls="ls ~/.fap"

#Demandes de droit d'admin implicites
alias pacman="sudo pacman --color always"
alias wifi="sudo wifi-menu"
alias shutdown="sudo shutdown"
alias reboot="sudo shutdown -r"

#Gestion de commandes
alias lscmd="ls $HOME/.cmd"
alias cdcmd.="cd $HOME/.cmd"
alias rmcmd="rm $HOME/.cmd/$1"
alias cdcmd="cd $HOME/Programmes/Commandes"

mkcmd()
{
	chmod +x $1 && cp $1 $HOME/.cmd
}
Il y a des alias utiles pour le script fap et aussi, vous trouverez une partie "Gestion de commandes"
J'ai en effet 2 dossiers dans mon $HOME: ~/.cmd et ~/Programmes/Commandes
~/Programmes/Commandes contient les commandes en cours de création (et le code fini si le code est fini)
alors que ~/.cmd ne contient que les commandes déjà finis prêts à être utilisé
J'ai fais ce système pour éviter de poluer /usr/bin/ comme je le faisais avant

Du coup, dans .bashrc, il est utile d'ajouter ceci:

Code : Tout sélectionner

PATH=$PATH:$HOME/.cmd
export PATH
Dans le miens, j'ai rajouter :. à $PATH pour éviter de devoir écrire ./ pour lancer un exécutable dans le répertoire courant

Re: [script] partagez vos créations !

Publié : lun. 03 déc. 2018, 01:13
par brunoo
Bonsoir,
je déterre ce fil pour partager un script bash qui affiche un petit sapin de noël sous les flocons de neiges dans le terminal.

Code : Tout sélectionner

#!/bin/bash
#
# petit sapin de noël ascii et sa guirlande sous les flocons de neige...
# 256 couleurs
# Auteur : Bruno
#
# # # # # # # # # 


# Variables script
lignes="$(tput lines)"
colonnes="$(tput cols)"
x_centrer=$((colonnes/2))
cpt=0
b="o"  # Représentera les boules clignotantes

declare -i x y # Coordonnées x et y flocon, fonction flocons_de_neige.
flocons=()
f=0

# Le pourcentage peut être augmenté pour avoir plus de flocons dans le terminal...
# mais attention, utilisation du processeur accrûe (boucle avec un sleep 0.2)
pourcentage=2
tt=$((lignes*colonnes))
nombre_flocons=$(((tt/100)*pourcentage))

# Variables couleurs
# Étoile et reflet sur le sapin
etoile=(220 208 207 199 135 69 39 81 87 159 193)
reflet=(228 215 175 163 141 67 24 117 51 123 157)

# Boules clignotantes
bleu=(26 39)       # bleu foncé et bleu clair
cyan=(30 87)       # cyan foncé et cyan clair
rose=(97 219)      # rose ...
orange=(130 202)   # orange ...
jaune=(136 228)    # jaune ...
magenta=(93 207)   # magenta ...
vert=(22 46)       # vert ...

# guirlande
c_guirl="\E[38;5;153m"       # Bleu pale
# Neige
c_neige="\E[1m\e[38;5;244m"  # Gris
# Branche du sapin
c_branche="\E[38;5;34m"      # Vert
# Tronc
c_tronc="\E[38;5;58m"        # Marron
# Init
reset="\E[0;m"               # Init

###### Fonctions #############
restaure (){ # Opérations effectuées par trap.
    bonnet_noel
    printf "\E[0m\E[H"
    tput cnorm
    exit
}

flocons_de_neige (){ # fonction qui fait tomber des flocons de neige.

    printf '%b' "$c_neige" # Couleur

    # Envoi de flocons jusqu'au nombre voulu
    if [[ ${i:=-1} -lt $nombre_flocons ]]; then
        flocons[i+=1]="0:$((RANDOM%colonnes +1))"
    fi
    # Animation
    for ((f=0;f<${#flocons[*]}; f++)); do
        # Extrait les coordonnées
        x=${flocons[f]#*:}
        y=${flocons[f]%:*}

        printf '\E[%d;%dH ' $y $x  # Efface le flocon
        y="y+1"                    # Descend "    "

     # Ici, on évite que les flocons passent devant le sapin...
        if (( y == (lignes-14) && x > x_centrer -4 && x < x_centrer +4 )) || \
           (( y == (lignes-7) && x > x_centrer -6 && x < x_centrer +6 )) || \
           (( y == (lignes-4) && x > x_centrer -8 && x < x_centrer +8 )) || \
           (( y == lignes )); then # ... et ici, on arrive au sol (bas du terminal).
            flocons[f]="0:$((RANDOM%colonnes +1))" # nouvelle coordonnée
        else
            flocons[f]="$y:$x"
            printf '\E[%d;%dH*' $y $x # Affiche le flocon
        fi
    done
    printf '%b' "${reset}" # Reset couleur
}

etoile_sapin (){ # Étoile sur sapin

    ct=${ct:=-1}
    (( (ct+=1) == ${#etoile[*]} )) && ct=0

    printf  '\E[0m\E[38;5;%dm\E[%d;%dH· ╵ ·' "${reflet[ct]}" $((lignes-14)) $((x_centrer-2))
    printf  '\E[%d;%dH-  \E[1m\E[38;5;%dm@\E[0m\E[38;5;%dm  -' $((lignes-13)) $((x_centrer-3)) "${etoile[ct]}" "${reflet[ct]}"
    printf  '\E[%d;%dH· ╷ · \E[0m' $((lignes-12)) $((x_centrer-2))
}

boules_clignotantes (){

    local a="$1" # 0 ou 1 en argument, normal ou gras ( éteinte, allumée)

    printf '\E[%dm' "$a"

    printf '\E[38;5;%dm\E[%d;%dH%s' "${cyan[a]}" $((lignes-10)) ${x_centrer} ${b}       # boule1
    printf '\E[38;5;%dm\E[%d;%dH%s' "${rose[a]}" $((lignes-8)) $((x_centrer-1)) ${b}    # boule2
    printf '\E[38;5;%dm\E[%d;%dH%s' "${vert[a]}" $((lignes-7)) $((x_centrer+2)) ${b}    # boule3
    printf '\E[38;5;%dm\E[%d;%dH%s' "${bleu[a]}" $((lignes-6)) $((x_centrer-3)) ${b}    # boule4
    printf '\E[38;5;%dm\E[%d;%dH%s' "${orange[a]}" $((lignes-5)) $((x_centrer+1)) ${b}  # boule5
    printf '\E[38;5;%dm\E[%d;%dH%s' "${jaune[a]}" $((lignes-4)) $((x_centrer-4)) ${b}   # boule6
    printf '\E[38;5;%dm\E[%d;%dH%s' "${magenta[a]}" $((lignes-4)) $((x_centrer+5)) ${b} # boule7
    printf '\E[38;5;%dm\E[%d;%dH%s' "${cyan[a]}" $((lignes-3)) $((x_centrer-1)) ${b}    # boule8
    printf '%b' "${reset}"
}

bonnet_noel (){
    printf '%b\E[%d;%dH#####' "$reset" $((lignes-11)) $((x_centrer-2))
    printf '\E[0;31m\E[%d;%dH *** ' $((lignes-12)) $((x_centrer-2))
    printf '\E[%d;%dH   *   ' $((lignes-13)) $((x_centrer-3))
    printf '\E[%d;%dH  %b@  ' $((lignes-14)) $((x_centrer-2)) "$reset"
}


# ------------------------------***********-------------------------------- #
############################--- *  ENVOI  * ---##############################
# ------------------------------***********-------------------------------- #

trap 'restaure' SIGINT  # gére l' arrêt du script
tput civis              # Curseur invisible
clear                   # Reset terminal

# Construction sapin
printf "%b" "$c_branche"
printf "\E[%d;%dH/ \\" $((lignes-11)) $((x_centrer-1))
printf "\E[%d;%dH/   \\" $((lignes-10)) $((x_centrer-2))
printf "\E[%d;%dH/   \\" $((lignes-9)) $((x_centrer-2))
printf "\E[%d;%dH/     \\" $((lignes-8)) $((x_centrer-3))
printf "\E[%d;%dH/       \\" $((lignes-7)) $((x_centrer-4))
printf "\E[%d;%dH/       \\" $((lignes-6)) $((x_centrer-4))
printf "\E[%d;%dH/         \\" $((lignes-5)) $((x_centrer-5))
printf "\E[%d;%dH/           \\" $((lignes-4)) $((x_centrer-6))
printf "\E[%d;%dH/             \\" $((lignes-3)) $((x_centrer-7))
printf "\E[%d;%dH\"\"\"\"\"     \"\"\"\"\"" $((lignes-2)) $((x_centrer-7))
printf "%b\E[%d;%dH| |" "$c_tronc" $((lignes-1)) $((x_centrer-1))

# guirlande
printf "%b\E[%d;%dH;;" "$c_guirl" $((lignes-9)) $((x_centrer-1))
printf "\E[%d;%dH\`;;" $((lignes-8)) ${x_centrer}
printf "\E[%d;%dH;;;" $((lignes-7)) $((x_centrer-3))
printf "\E[%d;%dH\`\`;;;" $((lignes-6)) $((x_centrer-1))
printf "\E[%d;%dH;;;" $((lignes-5)) $((x_centrer-4))
printf "\E[%d;%dH\`\`;;;" $((lignes-4)) $((x_centrer-2))
printf "\E[%d;%dH\`\`;;;" $((lignes-3)) $((x_centrer+2))

# tapis de neige
printf "%b" "$c_neige"
for((t=0; t<=colonnes; t++)); do
    printf "\E[%d;%dH*" "$lignes" "$t"
done
printf "%b" "$reset"

# guirlande clignotante éteinte et étoile sur le sapin
boules_clignotantes 0
etoile_sapin

# boucle infinie
while true ; do

    flocons_de_neige

    (( (cpt+=1)%10 )) || boules_clignotantes "0"
    (( cpt%15 )) || etoile_sapin
    (( cpt%20 )) || { boules_clignotantes "1"; cpt=0; }

    sleep 0.2

done # Ctrl+c requis pour arrêter le script

exit 0
Ctrl + c pour stopper le script.

Edit : 28/12/2018:
En passant le script ici https://www.shellcheck.net/, beaucoup d'erreurs dues à une mauvaise utilisation de printf.
Cela n'empêchait pas le fonctionnement. C'est corrigé ci-dessus.

Re: [script] partagez vos créations !

Publié : lun. 03 déc. 2018, 09:53
par FoolEcho
brunoo a écrit : lun. 03 déc. 2018, 01:13je déterre ce fil pour partager un script bash qui affiche un petit sapin de noël sous les flocons de neiges dans le terminal.
Ahalala... J'ai toujours sous le coude une refonte de xsnow :ancetre2: (en Qt5) partiellement terminée... Il manque «juste» la gestion de l'empilement de la neige (faut que je creuse la question du bibliothèque pour la position des fenêtres...), sinon le reste y est: la neige, le vent, 'tit papa Noël bravant les éléments, sapins... et quelques ajouts: thèmes possibles/dessins en svg, localisation... ... 'tain... faut vraiment que je le continue.. :(

Re: [script] partagez vos créations !

Publié : lun. 03 déc. 2018, 10:26
par hopimet
brunoo a écrit : lun. 03 déc. 2018, 01:13 Bonsoir,
je déterre ce fil pour partager un script bash qui affiche un petit sapin de noël sous les flocons de neiges dans le terminal.
Très mignon ! Merci :)