2009/08/27

zcp un wrapper pour cp

L'autre jour sidh me demandait si je n'avais rien en zsh pour pouvoir suivre la progression d'un cp volumineux et je n'avais rien, mais j'ai trouvé l'idée intéressante. Un petit man cp plus tard, je me rend compte que le cp de FreeBSD il est beau et bien foutu, en lui envoyant un SIGINFO il nous dis ce qu'il fait et ou il en est. De là a wrapper tout dans un petit script zsh il n'y avait qu'un pas.

De plus zsh permet de créer un tty virtuel (zpty) dans lequel on peut exécuter des commandes et interagir, du coup, voici un petit script bien pratique :

#!/usr/local/bin/zsh
setopt extendedglob
zmodload zsh/zpty
zpty copy "cp $@ 2>&1"     
ZPTYPID=${${=${(M)${(f)"$(ps -o pid,ppid,command)"}:#[[:space:]]#[[:digit:]]##[[:space:]][[:space:]]#$$*zsh*}}[1]}
CPPID=${${=${(M)${(f)"$(ps -o pid,ppid,command)"}:#[[:space:]]#[[:digit:]]##[[:space:]][[:space:]]#${ZPTYPID}*cp*}}[1]}
line=""
while [ : ]
do
    zpty -rt copy out
    if [[ $#out -gt 0 ]]
    then
        newline=${${=${out}}[0,-2]}
        percent=${${=${out}}[-1]}
        if [[ -z $line || "x$newline" != "x$line" ]]
        then
            [[ -n $line ]] && print "${line}: done"
            line=$newline
            print "${line}: ${(l: ::4:)percent}\c"
        else
            print "\r${line}: ${(l: ::4:)percent}\c"
        fi
    fi
        kill -SIGINFO $CPPID 2>/dev/null || break
done
[[ -n $line ]] && print "${line}: done"
zpty -d copy

la sortie donne : # zcp toto.iso bla/ toto.iso -> bla/toto.iso: 48%

UPDATE: Apparemment ça ne fonctionne qu'avec zsh 4.3.10+

Fneufneu wrote on 2009/09/25 :

sympa ce zcp, il est sur mon desktop now :) thx bapt

sinon
je chie sur les spams mais pas sur IE !
ahah ! vive les commentaires postés sous IE.


Bapt wrote on 2009/09/25 :

Grmblbl


Name :
URL (optional) :
Write here: "ETOOMUCHSPAM"
Comments :