#1 Le 09/07/2008, à 22:05
- Totor
[bash] - mycp : copie avec progression
Bonsoir,
Lassé d'effectuer des copies de fichiers en shell sans en connaître la progression, j'ai écris un petit script sans prétention qui permet de fournir cette information.
Il s'agit d'une copie basique. Nombre d'évolutions pour l'adapter à la syntaxe et l'utilisation de la commande cp pourront être ajoutées. La qualité du code est très certainement discutable : je suis preneur des remarques.
Je poste le script car je pense qu'il peut intéresser du monde.
Je le ferai évoluer pour qu'il soit pleinement compatible avec la commande cp. Les nouvelles versions seront postées ci-dessous :
#!/bin/bash
trap "finScript" SIGINT SIGTERM
mycpVersion=1.4
#*************************************************************************************************************************
# Nom : mycp *
# Objet : copie de fichiers avec progression *
#*************************************************************************************************************************
# Version Date Objet *
# 1.0 09/07/2008 Création *
# 1.1 10/07/2008 -Gestion des signaux d'arrêt *
# -Affichage de la destination *
# 1.2 11/07/2008 -Ajout d'informations temporelles *
# -globalisation des variables nbCols et terminal pour diminuer les actions *
# 1.3 12/07/2008 -Gestion de dossier comme source *
# -Correction de la gestion de fin d'une copie *
# -Affichae allégé *
# -Correction bug dans l'affichae de la progession *
# 1.4 XX/XX/2008 -Compatibilité commande cp *
#*************************************************************************************************************************
#*************************************************************************************************************************
# variables globales *
#*************************************************************************************************************************
# indique si le traitement a été interrompu par un CTRL+C ou autre
export batchInterrompu=0
# n° du PID de la copie en cours
export numPID=0
# Nombre de colonnes du terminal
export nbCols=0
# récupération du terminal
export terminal=`tty`
# liste des options acceptées par la commande cp
export listeOptsLettre="abdfiHlLPpcRrsS:t:TuxvZ:"
export listeOptsMots="archive;backup;copy-contents;force;interactive;link;dereference;no-dereference;preserve;no-preserve;parents;recursive;remove-destination;sparse;strip-trailing-slashes;symbolic-link;suffix;target-directory;no-target-directory;update;one-file-system;context;help;version"
# liste des options
export listeOptions=""
# liste des fichiers/dossiers sources
export listeFichiers=""
export opti=0 # mode interactif
export optH=0 # suivre les liens symbolique
export optL=0 # toujours suivre les liens symboliques
export optparents=0 # accoler le chemin source au répertoire
export optR=0 # copie récursive
export optremoveDestination=0 # enlever le fichier cible avant ouverture
export optslash=0
export opts=0 # creer des liens symboliques
export optt=0 # copier toutes les sources dans le dossier fourni
export optT=0 # considérer la cible comme fichier normal
export optv=0 # mode verbeux
export optversion=0 # option version
export opthelp=0 # option help
#*************************************************************************************************************************
# Nom : finScript *
# Objet : Construit une chaine de n caractères *
#*************************************************************************************************************************
# Version Date Objet *
# 1.0 10/07/2008 Création *
#*************************************************************************************************************************
# paramètres : *
#*************************************************************************************************************************
function finScript
{
# on indique que le batch a été interrompue
batchInterrompu=1
# kill de la copie en cours si il y en a une
[[ ${numPID} -ne 0 && `ps --pid ${numPID}|wc -l` -ne 1 ]] && kill -9 ${numPID}
echo "Copie(s) interrompue(s).">${terminal}
exit 2
}
#*************************************************************************************************************************
# Nom : defTailleChaine *
# Objet : Construit une chaine de n caractères *
#*************************************************************************************************************************
# Version Date Objet *
# 1.0 09/07/2008 Création *
#*************************************************************************************************************************
# paramètres : *
# $1 : chaine initiale *
# $2 : taille maximale *
# $3 : caractère ou texte complétant la chaine *
#*************************************************************************************************************************
function defTailleChaine
{
chaine="$1"
taille=$2
caractere="$3"
[ "${caractere}" == "" ] && caractere=" ";
while [ ${#chaine} -lt ${taille} ]
do
chaine="${chaine}${caractere}"
done
chaine="${chaine:0:${taille}}"
echo "${chaine}"
}
#*************************************************************************************************************************
# Nom : calculDuree *
# Objet : calcul la durée écoulée entre 2 heures (unité=secondes) *
#*************************************************************************************************************************
# Version Date Objet *
# 1.0 11/07/2008 Création *
#*************************************************************************************************************************
# paramètres : *
# $1 : Heure de début *
# $2 : Heure de fin *
#*************************************************************************************************************************
function calculDuree
{
debut=$1
fin=$2
secDebut=`echo ${debut}|awk -F":" '{print $1*3600+$2*60+$3 }'`
secFin=`echo ${fin}|awk -F":" '{print $1*3600+$2*60+$3 }'`
let duree=${secFin}-${secDebut}
echo ${duree}
}
#*************************************************************************************************************************
# Nom : formatDuree *
# Objet : Formate une durée en seconde : format de sortie = <HH>h <MM>m <SS>s *
#*************************************************************************************************************************
# Version Date Objet *
# 1.0 11/07/2008 Création *
#*************************************************************************************************************************
# paramètres : *
# $1 : durée *
#*************************************************************************************************************************
function formatDuree
{
duree=$1
echo `date +"%Hh %Mm %Ss" --date "${duree} secs 00:00:00"`
}
#*************************************************************************************************************************
# Nom : ajouteDuree *
# Objet : Ajoute une durée de n seconde à une heure *
#*************************************************************************************************************************
# Version Date Objet *
# 1.0 11/07/2008 Création *
#*************************************************************************************************************************
# paramètres : *
# $1 : heure de début *
# $2 : durée *
#*************************************************************************************************************************
function ajouteDuree
{
debut=$1
duree=$2
echo `date +%H:%M:%S --date "${duree} secs ${debut}"`
}
#*************************************************************************************************************************
# Nom : afficheEvolution *
# Objet : Affiche le % de la copie *
#*************************************************************************************************************************
# Version Date Objet *
# 1.0 09/07/2008 Créion *
# 1.1 10/07/2008 Ajout de la destination *
# 1.2 11/07/2008 Affichage des informations temporelles *
# 1.3 12/07/2008 Correction bug calcul (lorsque la taille cible=0 *
# Moins d'infos affichées *
#*************************************************************************************************************************
# paramèes : *
# $1 : nom fichier *
# $2 : taille copiee *
# $3 : taille totale *
# $4 : destination *
# $5 : heure de début de la copie *
#*************************************************************************************************************************
function afficheEvolution
{
fichier="$1"
tailleCopiee=$2
tailleTotale=$3
destination="$4"
heureDebut=$5
# calcul du pourcentage :
[ ${tailleCopiee} -lt 0 ] && tailleCopiee=0
pourcentage=0
[ ${tailleTotale} -ne 0 ] && let pourcentage=${tailleCopiee}*100/${tailleTotale}
#calcul des informations temporelles
if [[ ${tailleTotale} -eq 0 || ${pourcentage} -eq 0 ]]; then
heureFin="??h ??m ??s"
dureeEcouleeFormatee=${heureFin}
dureeRestanteFormatee=${heureFin}
dureeTotaleFormatee=${heureFin}
else
heure=`date +%H:%M:%S`
dureeEcoulee=`calculDuree ${heureDebut} ${heure}`
let dureeTotale=${dureeEcoulee}*100/${pourcentage}
let dureeRestante=${dureeTotale}-${dureeEcoulee}
heureFin=`ajouteDuree ${heureDebut} ${dureeTotale}`
dureeEcouleeFormatee=`formatDuree ${dureeEcoulee}`
dureeRestanteFormatee=`formatDuree ${dureeRestante}`
dureeTotaleFormatee=`formatDuree ${dureeTotale}`
fi
# formatage du texte
texte="${fichier} : ${pourcentage} % | Début : ${heureDebut} | [écoulée]-[restante]-[totale] : [${dureeEcouleeFormatee}]-[${dureeRestanteFormatee}]-[${dureeTotaleFormatee}] | Fin : ${heureFin}"
texte=`defTailleChaine "${texte}" ${nbCols}`
echo -ne "\r${texte}" >${terminal}
}
#*************************************************************************************************************************
# Nom : afficheFin *
# Objet : Affiche la fin de la copie d'un fichier *
#*************************************************************************************************************************
# Version Date Objet *
# 1.0 09/07/2008 Création *
# 1.1 10/07/2008 Ajout de la destination *
# 1.2 10/07/2008 Ajout d'informations temporelles *
#*************************************************************************************************************************
# paramètres : *
# $1 : nom fichier *
# $2 : taille copiee *
# $3 : taille totale *
# $4 : destination *
# $5 : heure de début *
#*************************************************************************************************************************
function afficheFin
{
fichier="$1"
tailleCopiee=$2
tailleTotale=$3
destination="$4"
heureDebut=$5
# calcul des informations temporelles
heureFin=`date +%H:%M:%S`
dureeCopie=`calculDuree ${heureDebut} ${heureFin}`
dureeCopie=`formatDuree ${dureeCopie}`
fin="ok"
[ ${tailleTotale} -ne ${tailleCopiee} ] && fin="ko"
texte="${fichier} : ${fin} | Début : ${heureDebut} | Fin : ${heureFin} | Durée : ${dureeCopie}"
texte=`defTailleChaine "${texte}" ${nbCols}`
echo -e "\r${texte}" >${terminal}
}
#*************************************************************************************************************************
# Nom : taille *
# Objet : calcul la taille d'un fichier *
#*************************************************************************************************************************
# Version Date Objet *
# 1.0 09/07/2008 Création *
#*************************************************************************************************************************
# paramètres : *
# $1 : nom fichier *
#*************************************************************************************************************************
function taille
{
fichier="$1"
tailleFichier=-1
[ -a "${fichier}" ] && tailleFichier=`du "${fichier}"|cut -f1`
echo ${tailleFichier}
}
#*************************************************************************************************************************
# Nom : copier *
# Objet : lance la copie d'un fichier *
#*************************************************************************************************************************
# Version Date Objet *
# 1.0 09/07/2008 Création *
# 1.1 10/07/2008 Adaptation pour gestion des signaux d'arrêt *
# 1.2 11/07/2008 Gestion de l'heure de début de la copie *
# 1.3 12/07/2008 Amélioration du processus de fin de la copie *
# 1.4 14/07/2008 Prise en compte des arguments de la commande cp *
#*************************************************************************************************************************
# paramètres : *
# $1 : nom fichier source *
# $2 : destination *
#*************************************************************************************************************************
function copier
{
source="$1"
destination="$2"
fichier_sortie="${HOME}/$$.out"
fichier_erreur="${HOME}/$$.err"
[[ ! -a ${source} ]] && return
[[ -a "${fichier_sortie}" ]] && rm -f "${fichier_sortie}"
[[ -a "${fichier_erreur}" ]] && rm -f "${fichier_erreur}"
touch ${fichier_sortie} ${fichier_erreur}
# récupération de la taille source
tailleSource=`taille "${source}"`
# Si la destination est un dossier alors construction du nom du fichier destiation.
# Pour cela, on supprime le / à la fin du nom de dossier (si présent) que l'on concatène avec le nom du fichier source
[[ -d "${destination}" ]] && destination="`echo "${destination}"|sed "s/\(.*\)\/$/\1/"`/`basename "${source}"`"
## suppression du ficher s'il existe
#[ -a ${destination} ] && echo "" > "${destination}"
# récupération de l'heure de début
heureDebut="`date +%H:%M:%S`"
# on lance la copie en arrière plan
cp "${source}" "${destination}" 2>"${fichier_erreur}" 1>"${fichier_sortie}" &
numPID=$!
afficheEvolution "${source}" 0 ${tailleSource} "${destination}" ${heureDebut}
# tant que le process existe, c'est que la copie est en cours...
while [[ `ps --pid ${numPID}|wc -l` -ne 1 ]]
do
tailleDestination=`taille "${destination}"`
afficheEvolution "${source}" ${tailleDestination} ${tailleSource} "${destination}" ${heureDebut}
done
numPID=0
# on affiche l'état finale de la copie
tailleDestination=`taille "${destination}"`
afficheFin "${source}" ${tailleDestination} ${tailleSource} "${destination}" ${heureDebut}
[[ -s "${fichier_sortie}" ]] && ( echo "Sortie cp : " && cat "${fichier_sortie}" )
[[ -s "${fichier_erreur}" ]] && ( echo "Erreur cp : " && cat "${fichier_erreur}" )
}
#*************************************************************************************************************************
# Nom : verifierOptions *
# Objet : Verification des paramètres passé au script *
#*************************************************************************************************************************
# Version Date Objet *
# 1.0 07/08/2008 Création *
#*************************************************************************************************************************
# paramètres : *
# $* : liste des paramétres du script après gestion des paramétres commencant pas -- *
#*************************************************************************************************************************
function verifierOptions
{
while getopts ":${listeOptsLettre}" option
do
case ${option}
in
"\?") erreur=1;;
*) [ -z "${options}" ] && options="-";
if [ -z ${OPTARG} ]; then
options="${options}${option}"
# suppression de la ligne de commande
listeFichiers="`echo "${listeFichiers}"|sed "s/-[^ ]*${option}//"`"
else
options="${options} -${option}=${OPTARG}"
# suppression de la ligne de commande
listeFichiers="`echo "${listeFichiers}"|sed "s/-${option}[ ]\*${OPTARG}//"`"
fi;;
esac
[ ${erreur} -ne 0 ] && break;
done
listeFichiers="`echo "${listeFichiers}"|sed 's/""//g;s/^[[:space:]]//g;s/[[:space:]]$//g'`"
}
#*************************************************************************************************************************
# Nom : verifierParametres *
# Objet : Verification des paramètres passé au script *
#*************************************************************************************************************************
# Version Date Objet *
# 1.0 13/07/2008 Création *
#*************************************************************************************************************************
# paramètres : ensemble des arguments (par propore mais pas trouvé autrement) *
#*************************************************************************************************************************
function verifierParametres
{
lstOptionsMots="`echo ";${listeOptsMots}"|sed "s/;/;--/g"`;"
# on reconstruit la ligne de commande pour la stocker et supprimer les options afin de concerver les SOURCES/CIBLE
listeFichiers="${ligneCmd}"
params=""
erreur=0
for param; do
option="`echo "${param}"|grep '\(--\)\{1\}.\+[=]*$'`"
if [ -n "${option}" ]; then
option="`echo "${param}"|sed 's/\(--[^=]*\)=.*$/\1/'`"
# il s'agit d'un paramètre commencant par --
if [ -n "`echo "${lstOptionsMots}"|grep -o ";${option};"`" ]; then
# il se trouve dans la liste des options autorisés
nomOption="${option:2}"
if [ "${nomOption}" = "help" ] || [ "${nomOption}" = "version" ]; then
eval "opt${nomOption}=1"
else
params="$params ${param}"
fi
# on supprime de cmd
listeFichiers="`echo "${listeFichiers}"|sed "s/${param}//"`"
else
#paramétre non reconnu
erreur=1
fi
fi
[ ${erreur} -ne 0 ] && break;
done
listeFichiers="`echo "${listeFichiers}"|sed 's/""//g;s/^[[:space:]]//g;s/[[:space:]]$//g'`"
if [ ${erreur} -eq 0 ]; then
export options=""
export erreur=0
eval "verifierOptions ${listeFichiers}"
fi
listeOptions="${options} ${params}"
return ${erreur}
}
#*************************************************************************************************************************
# Nom : afficherSyntaxe *
# Objet : Affichage de la syntaxe d'utilisation du script *
#*************************************************************************************************************************
# Version Date Objet *
# 1.0 13/07/2008 Création *
#*************************************************************************************************************************
# paramètres : *
# $1 : Nom du script *
#*************************************************************************************************************************
function afficherSyntaxe
{
cmd=`basename $1`
message=$2
if [ -n "${message}" ]; then
echo -e "\t${cmd} (V. ${mycpVersion}) : ${message}\n\tcf. man cp"
else
echo -e "\t${cmd} (V. ${mycpVersion}) : cf. man cp"
fi
return
}
#*************************************************************************************************************************
# gestion des paramétres *
#*************************************************************************************************************************
#reconstruction de la ligne de commande :
export ligneCmd=""
for valeur; do
ligneCmd="${ligneCmd} \"${valeur}\""
done
eval "verifierParametres ${ligneCmd}"
verif=$?
[ ${verif} -ne 0 ] && ( afficherSyntaxe $0 "Paramétres incorrectes."; exit 5 )
# cas particulier des options --help et --version
if [[ ${optversion} -eq 1 || ${opthelp} -eq 1 ]]; then
if [ ${optversion} -eq ${opthelp} ] || [ "${listeOptions}" != " " ]; then
# il y a d'autres paramètres, c'est une erreur
afficherSyntaxe $0 "Paramétres incorrectes."
exit 5
else
afficherSyntaxe $0
exit 0
fi;
fi
#*************************************************************************************************************************
# Début du traitement *
#*************************************************************************************************************************
listeFichiers=(`echo ${listeFichiers}|sed "s/\'//g"`)
nbParm=${#listeFichiers[*]}
numParm=0
let numParmCible=${nbParm}-1
let numParmFinSource=${nbParm}-2
cible="`echo ${listeFichiers[${numParmCible}]}|sed 's/^"\(.*\)"$/\1/'`"
while [[ ${numParm} -le ${numParmFinSource} && ${batchInterrompu} -eq 0 ]]
do
source="`echo ${listeFichiers[$numParm]}|sed 's/^"\(.*\)"$/\1/'`"
if [ -d "${source}" ]; then
if [ ! -d "${cible}" ]; then
# la source est un dossier mais pas la cible (cas où il n'y a que 2 paramètres et que la source est un dossier mais pas la cible)
echo "Impossible de copier un dossier dans un fichier."
exit 4
else
# la source est un dossier, on copie donc la totalité du dossier
# construction du nom de dossier cible
nomDossier="`basename "${source}"`"
dossierCible="${cible}/${nomDossier}"
source="`echo ${source}|sed "s/\/$//"`"
# copie de tous les fichiers récursivement
for fichier in `find "${source}" -name "*" -a ! -type d`
do
nbCols=`stty -a|sed '/columns/!d;s/.*columns \([0-9]\{1,3\}\).*/\1/'`
# on construit le nom de dossier cible pour le fichier à copier
nomFichierSource="`basename "${fichier}"`"
nomDossierSource="`dirname "${fichier}"`"
repCible="`echo "${nomDossierSource}"|sed "s#^${source}#${dossierCible}#"`"
# création du dossier cible s'il n'existe pas
mkdir -p "${repCible}" 2>/dev/null 1>/dev/null
# nom cible du fichier
fichierCible="${repCible}/${nomFichierSource}"
# on lance la copie
(copier "${fichier}" "${fichierCible}")
[ ${batchInterrompu} -ne 0 ] && break
done
fi
else
nbCols=`stty -a|sed '/columns/!d;s/.*columns \([0-9]\{1,3\}\).*/\1/'`
copier "${source}" "${cible}"
fi
let numParm=${numParm}+1
done
echo "Copie(s) terminée(s)."
exit 0
Note : la version actuelle du script considère les (n-1)ièmes premier paramètres comme des fichiers sources (les dossiers ne sont pas encore pris en compte) et le dernier comme fichier/dossier destination. Si il y a plusieurs fichiers sources et si le dernier paramètre est un fichier, alors ce fichier sera successivement la cible de tous les fichiers sources.
EDIT : depuis V.1.3, les dossiers comme source sont accéptés et la cible ne peut être un fichier si il y a plusieurs sources ou si la source est un dossier.
Dernière modification par Totor (Le 02/09/2008, à 17:40)
-- Lucid Lynx --
Hors ligne
#2 Le 10/07/2008, à 21:02
- Totor
Re : [bash] - mycp : copie avec progression
V.1.1 :
- Fiabilisation du traitement avec gestion des signaux d'arrêt
- Affichage de la cible
Pour la prochaine version (si j'ai le temps avant jeudi prochain, début de mes congés) :
- gestion des paramétres reconnus par la commande cp
- ajout des informations : durée écoulée, durée restante estimée
-- Lucid Lynx --
Hors ligne
#3 Le 10/07/2008, à 21:42
- nicolas66
Re : [bash] - mycp : copie avec progression
Et ca, c'est pas cool ?
"The computer was born to solve problems that did not exist before." (B. Gates)
Hors ligne
#4 Le 11/07/2008, à 08:14
- Totor
Re : [bash] - mycp : copie avec progression
Je me doutais bien que j'aurais une réponse de ce type un jour où l'autre
Merci pour l'info.
-- Lucid Lynx --
Hors ligne
#5 Le 11/07/2008, à 18:06
- nicolas66
Re : [bash] - mycp : copie avec progression
Désolé, je poste à chaud sans avoir testé ton script et sans savoir s'il possède quelques features inédites par rapport au lien que je t'ai donné . Ca peut peut-être valoir le coup de jeter un coup d'oeil.
Juste pour info : il aurait existé une version de `cp', mais ca n'avait rien d'officiel.
Dernière modification par nicolas66 (Le 11/07/2008, à 21:55)
"The computer was born to solve problems that did not exist before." (B. Gates)
Hors ligne
#6 Le 11/07/2008, à 18:19
- Totor
Re : [bash] - mycp : copie avec progression
V.1.2 :
-ajout des informations temporelles (formatage à revoir)
-globalisation de 2 variables pour limiter les actions
Désolé, je poste à chaud sans savoir testé ton script et sans savoir s'il possède quelques features inédites par rapport au lien que je t'ai donné
. Ca peut peut-être valoir le coup de jeter un coup d'oeil.
Juste pour info : il aurait existé une version de `cp', mais ca n'avait rien d'officiel.
t'inquiète : je ne l'ai vraiment pas mal pris
J'avais connaissance de l'existance d'outils similaires mais j'avais envie de réinventer la roue
J'ai tout de même été jeté un oeil à ton lien. Cela m'a permis d'apprendre la commande strace. Mon script n'a rien à envier à celui que tu m'as montré.
Merci
Dernière modification par Totor (Le 11/07/2008, à 19:48)
-- Lucid Lynx --
Hors ligne
#7 Le 11/07/2008, à 23:32
- reeth
Re : [bash] - mycp : copie avec progression
Cela a l'air intéressant quand on copie des fichiers lourds, merci
Hors ligne
#8 Le 12/07/2008, à 12:38
- redisded
Re : [bash] - mycp : copie avec progression
Bonjour, petite question de curiosité :
Pourquoi avoir choisi ksh ? Est-ce tout simplement ton shell préféré ou avais-tu une raison précise?
J'ai souvent lu qu'il fallait choisir son shell en fonction du script à faire, mais je ne sais pas trop en fonction de quoi choisir, donc je fais tout en bash parce que c'est ce qui semble le plus utilisé mais bon...
Hors ligne
#9 Le 12/07/2008, à 12:52
- Totor
Re : [bash] - mycp : copie avec progression
Tu veux la vérité ?
Benh j'en sais rien ! Ca ne fait que peut de temps que je bosse sous Linux et Solaris (8 mois). Les dév existants étaient réalisés en ksh... donc j'ai continué. Je sais simplement que ksh est une extension du bash.
Dernière modification par Totor (Le 12/07/2008, à 13:40)
-- Lucid Lynx --
Hors ligne
#10 Le 12/07/2008, à 12:56
- redisded
Re : [bash] - mycp : copie avec progression
oki, re-merci de ta réponse
Ca ne fait que peut de temps que je bosse sous Linux et Solaris (8 mois).:lol:
Arff j'y suis depuis déja deux ans, et t'arrete pas de m'apprendre des trucs...
Hors ligne
#11 Le 12/07/2008, à 16:12
- Totor
Re : [bash] - mycp : copie avec progression
V.1.3 :
Gestion de dossier comme source
Correction de la gestion de fin d'une copie
Affichage allégé
Correction bug dans l'affichae de la progession
Notes :
- si vous voyez un moyen d'améliorer les perfs, je suis preneur.
- est-il possible d'afficher du texte sur plusieurs lignes puis d'effacer ou remplacer ce texte dans sa totalité ? J'ai testé en essayant de modifier la variable LINENO mais ça ne semble fonctionne pas. De même j'ai tenté un \r\b pour supprimer le \n mais ça ne fonctionne pas non plus !
-- Lucid Lynx --
Hors ligne
#12 Le 14/08/2008, à 21:59
- Totor
Re : [bash] - mycp : copie avec progression
Version 1.4a.
- la détection des paramétres est au point mais ils ne sont pas appliqués à la commande cp.
- passage de ksh à bash pour des problèmes que je ne me souviens plus (Il y a eu 15 jours de congés en Espagne depuis + 2 semaines de TAF entre les 2)
Sinon, je n'irai pas plus loin dans les développements pour les raisons suivantes :
- je me suis aperçu que certaines options ne sont pas très évidentes à "greffer" au script
- je n'ai plus le courage car le principal est fait : simple copie de fichiers / dossiers
- par manque de temps (travaux à la maison + enfants)
Pour ceux/celles qui souhaitent continuer, je répondrai aux interrogations.
Bon courage.
EDIT : le sujet a donc été modifié.
Dernière modification par Totor (Le 14/08/2008, à 22:02)
-- Lucid Lynx --
Hors ligne
#13 Le 15/08/2008, à 14:16
- thy
Re : [bash] - mycp : copie avec progression
Je sais simplement que ksh est une extension du bash.
[troll]
et que zsh et une extension d'a peu pret tout les shelll existants
[/troll]
Désolé j'ai pas résisté.
Hors ligne