[{"data":1,"prerenderedAt":7977},["ShallowReactive",2],{"post-chiffrer-une-partition-d-un-disque":3,"related-chiffrer-une-partition-d-un-disque":797},{"id":4,"title":5,"author":6,"body":7,"category":775,"categorySlug":776,"date":777,"description":13,"excerpt":778,"extension":786,"location":787,"meta":788,"navigation":374,"path":789,"published":374,"seo":790,"slug":791,"stem":792,"tags":793,"timeToRead":440,"__hash__":796},"posts\u002Fposts\u002FSysAdmin\u002F2006-08-24-chiffrer-une-partition-d-un-disque.md","Chiffrer une partition d'un disque","Ulrich Vandenhekke",{"type":8,"value":9,"toc":765},"minimark",[10,14,17,20,25,69,84,89,106,112,116,119,125,129,146,150,156,159,162,168,171,175,186,192,195,201,205,211,214,220,226,232,238,244,250,256,260,265,271,276,282,285,291,294,300,304,307,312,318,323,329,332,338,342,353,709,761],[11,12,13],"p",{},"On peut se demander à quoi sert le chiffrage des partitions d'un disque\nsous Linux. Après tout, avec la gestion des droits on peut empêcher un\nutilisateur d'accéder à certain endroit du disque.",[11,15,16],{},"Maintenant, imaginez que vous travaillez pour une entreprise et que vous\npossédez des données confidentielles (les documents du dernier prototype\nde 'chez_pas_quoi', ...). En cas de vol de vos machines, un intrus\npeut lire le contenu du disque dur, avec un autre système\nd'exploitation, ou avec un autre Linux dont il aura les droits\nd'administrateur.",[11,18,19],{},"Heureusement, les données confidentielles auront été cachées dans une\npartition chiffrée du disque dur, et donc non accessible sans la clé de\ncryptage que vous aurez judicieusement choisie.",[21,22,24],"h3",{"id":23},"les-préparations","Les préparations",[26,27,28,32,60],"ul",{},[29,30,31],"li",{},"Il faut d'abord choisir une clé de chiffrage difficile à trouver.\nSouvent une suite de chiffres et de lettres minuscules\u002Fmajuscules\nmélangées n'ayant aucune signification, constitue une véritable clé,\ndifficilement cassable. Sont à proscrire les noms, les prénoms, les\ndates, ou tout autre événement lié à votre vie ou à la vie de\nl'entreprise.",[29,33,34,35,39,40,39,43,39,46,49,50],{},"Une partition vide. Cette partition doit être complètement vide de\ndonnées afin de pouvoir la reformater dans un autre système de\nfichier. Il vous faudra donc utiliser un logiciel tel que\n",[36,37,38],"code",{},"Gnu\u002FParted",", ",[36,41,42],{},"QtParted",[36,44,45],{},"Fdisk",[36,47,48],{},"LVM"," pour créer votre partition,\nou utiliser un fichier à l'aide de l'interface Loop. Dans les\nexemples ci-dessous nous utiliserons un volume logique issu de LVM.\nIl aura été créé à l'aide de la commande",[51,52,57],"pre",{"className":53,"code":55,"language":56},[54],"language-text","lvcreate -L10G -n secure-close debian\n","text",[36,58,55],{"__ignoreMap":59},"",[29,61,62,63],{},"Posséder un noyau 2.6 compiler avec le support Device-Manager, et\nDM-Crypt, ainsi que les utilitaires dmsetup et cryptsetup que vous\ninstallez sous Gnu\u002FDebian Sarge à l'aide de la commande :",[51,64,67],{"className":65,"code":66,"language":56},[54],"apt-get install dmsetup cryptsetup openssl\n",[36,68,66],{"__ignoreMap":59},[21,70,72,73],{"id":71},"préparation-de-la-partition1","Préparation de la partition",[74,75,76],"sup",{},[77,78,83],"a",{"href":79,"ariaDescribedBy":80,"dataFootnoteRef":59,"id":82},"#user-content-fn-2",[81],"footnote-label","user-content-fnref-2","1",[85,86,88],"h4",{"id":87},"cas-dune-partition","Cas d'une partition",[11,90,91,92,96,97,105],{},"Si vous stockez des données chiffrées sur une partition contenant à\nl'origine des données non cryptées ou des blancs, il sera très facile de\nrepérer les données chiffrées et les données claires, de voir la\nquantité de données chiffrées, voire même de les décrypter plus\nfacilement. Nous allons donc ",[93,94,95],"q",{},"nettoyer"," la partition en y écrivant\ndes données aléatoires ",[74,98,99],{},[77,100,104],{"href":101,"ariaDescribedBy":102,"dataFootnoteRef":59,"id":103},"#user-content-fn-1",[81],"user-content-fnref-1","2"," :",[51,107,110],{"className":108,"code":109,"language":56},[54],"dd if=\u002Fdev\u002Furandom of=\u002Fdev\u002Fdebian\u002Fsecure-close\n",[36,111,109],{"__ignoreMap":59},[85,113,115],{"id":114},"cas-dun-fichier","Cas d'un fichier",[11,117,118],{},"Vous pouvez aussi décider d'enregistrer vos données chiffrées dans un\nfichier (parce que vous n'avez plus d'espace libre pour une nouvelle\npartition par exemple). Pour cela, vous pouvez utiliser les commandes\nsuivantes. Il vous faudra alors utiliser le périphérique \u002Fdev\u002Floop0 dans\nla suite de l'article.",[51,120,123],{"className":121,"code":122,"language":56},[54],"dd if=\u002Fdev\u002Furandom of=\u002Fhome\u002Fsecure_close.img bs=1M count=10000\nlosetup \u002Fdev\u002Floop0 \u002Fhome\u002Fsecure_close.img\n",[36,124,122],{"__ignoreMap":59},[21,126,128],{"id":127},"chiffrement-de-la-partition-et-création-du-système-de-fichier","Chiffrement de la partition et création du système de fichier",[11,130,131,132,39,135,39,138,141,142,145],{},"Nous allons maintenant ouvrir notre partition en tant que système\nchiffré et formater son contenu. Vous pourrez formater la partition avec\nle système de fichier de votre choix (",[36,133,134],{},"ReiserFS",[36,136,137],{},"Ext3FS",[36,139,140],{},"Ext2FS",",\n",[36,143,144],{},"XFS",", ....)",[85,147,149],{"id":148},"sous-gnudebian-sarge","Sous Gnu\u002FDebian Sarge",[51,151,154],{"className":152,"code":153,"language":56},[54],"openssl rand -base64 64 | head -n 1 | openssl aes-256-ecb > \u002Fhome\u002Fsecure_close.key\n",[36,155,153],{"__ignoreMap":59},[11,157,158],{},"Cette ligne de commande va créer une clé de chiffrage dans le fichier\nsecure_close.key et le protéger à l'aide de votre mot de passe. Cela\nvous permettra de changer votre mot de passe, sans reformater la\npartition. Cette commande vous demandera alors votre mot de passe, il ne\nfaut maintenant plus l'oublier.",[11,160,161],{},"Maintenant nous allons chiffrer la partition à proprement parlé :",[51,163,166],{"className":164,"code":165,"language":56},[54],"openssl enc -d -aes-256-ecb -in \u002Fhome\u002Fsecure_close.key | cryptsetup create secure-open \u002Fdev\u002Fdebian\u002Fsecure-close\n",[36,167,165],{"__ignoreMap":59},[11,169,170],{},"Vous pourrez alors retrouver votre partition déchiffrée dans\n\u002Fdev\u002Fmapper\u002Fsecure-open. Il ne vous reste plus qu'a créer le système de\nfichier, monter la partition et copier les fichiers à protéger. (Vous\npouvez utiliser aussi un utilitaire d'effacement spécialisé pour écraser\nles fichiers avec un contenu aléatoire avant de réellement le\nsupprimer.)",[85,172,174],{"id":173},"sous-debian-etchsid","Sous Debian etch\u002Fsid",[11,176,177,178,182,183,185],{},"Sous Debian etch\u002Fsid, il est possible d'utiliser ",[179,180,181],"em",{},"Luks"," pour le\nchiffrage. Cela permet de stocker la clé au début de la partition, et de\npouvoir la modifier ultérieurement sans reformater. Cela permet de ne\nplus avoir de fichier séparé avec la clé.Pour formater une partition\nau format ",[179,184,181],{}," et ainsi l'initialiser avec le mot de passe de\nprotection, il faut utiliser la commande suivante (Attention à ne pas\noublier le mot de passe) :",[51,187,190],{"className":188,"code":189,"language":56},[54],"cryptsetup luksFormat \u002Fdev\u002Fdebian\u002Fsecure-close\n",[36,191,189],{"__ignoreMap":59},[11,193,194],{},"Après cela, on se retrouve avec une partition chiffré vierge. Il faut\ndonc l'ouvrir pour pouvoir ensuite y installer un système de fichier et\ndes fichiers. Pour cela, on utilise la commande suivante qui va associer\nà notre partition chiffrée une partition déchiffrée (virtuelle)",[51,196,199],{"className":197,"code":198,"language":56},[54],"cryptsetup luksOpen \u002Fdev\u002Fdebian\u002Fsecure-close secure-open\n",[36,200,198],{"__ignoreMap":59},[85,202,204],{"id":203},"préparation-et-protection-des-données","Préparation et protection des données",[51,206,209],{"className":207,"code":208,"language":56},[54],"mke2fs -j \u002Fdev\u002Fmapper\u002Fsecure-open\nmount -t ext3 \u002Fdev\u002Fmapper\u002Fsecure-open \u002Fmnt\ncp -a dossiers_confidentiels\u002F* \u002Fmnt\u002F\n",[36,210,208],{"__ignoreMap":59},[11,212,213],{},"Une fois que vous avez fini, vous pouvez démonter la partition, et\nsupprimer l'accès au contenu déchiffré.",[51,215,218],{"className":216,"code":217,"language":56},[54],"umount \u002Fmnt\n",[36,219,217],{"__ignoreMap":59},[11,221,222,223,225],{},"Si vous n'utilisez pas ",[179,224,181],{}," (sous Gnu\u002FDebian Sarge) :",[51,227,230],{"className":228,"code":229,"language":56},[54],"cryptsetup remove secure-open\n",[36,231,229],{"__ignoreMap":59},[11,233,234,235,237],{},"Si vous utilisez ",[179,236,181],{},", la commande est",[51,239,242],{"className":240,"code":241,"language":56},[54],"cryptsetup luksClose secure-open\n",[36,243,241],{"__ignoreMap":59},[11,245,246,247,105],{},"Et si vous avez créé un périphérique ",[36,248,249],{},"loop",[51,251,254],{"className":252,"code":253,"language":56},[54],"losetup -d \u002Fdev\u002Floop0\n",[36,255,253],{"__ignoreMap":59},[21,257,259],{"id":258},"utilisation-courante","Utilisation courante",[11,261,262,263,105],{},"Dans une utilisation courante vous allez monter la partition quand vous\nvoudrez y accéder, et la démonter quand vous ne l'utiliserez plus.Le\nmontage de la partition se fait à l'aide des commandes ci-dessous, si\nvous n'utilisez pas ",[179,264,181],{},[51,266,269],{"className":267,"code":268,"language":56},[54],"openssl enc -d -aes-256-ecb -in \u002Fhome\u002Fsecure_close.key | cryptsetup create secure-open \u002Fdev\u002Fdebian\u002Fsecure-close\nmount -t ext3 \u002Fdev\u002Fmapper\u002Fsecure-open \u002Fmnt\n",[36,270,268],{"__ignoreMap":59},[11,272,273,274],{},"et à partir de la commande suivante si vous utilisez ",[179,275,181],{},[51,277,280],{"className":278,"code":279,"language":56},[54],"cryptsetup luksOpen \u002Fdev\u002Fdebian\u002Fsecure-close secure-open\nmount -t ext3 \u002Fdev\u002Fmapper\u002Fsecure-open \u002Fmnt\n",[36,281,279],{"__ignoreMap":59},[11,283,284],{},"Le démontage de la partition est identique :",[51,286,289],{"className":287,"code":288,"language":56},[54],"umount \u002Fmntcryptsetup remove secure-open\n",[36,290,288],{"__ignoreMap":59},[11,292,293],{},"ou",[51,295,298],{"className":296,"code":297,"language":56},[54],"umount \u002Fmntcryptsetup luksClose secure-open\n",[36,299,297],{"__ignoreMap":59},[21,301,303],{"id":302},"changement-de-mot-de-passe","Changement de mot de passe",[11,305,306],{},"Quand vous souhaitez changer de mot de passe, vous pouvez utiliser la\ncommande suivante :",[11,308,309,310],{},"Sans ",[179,311,181],{},[51,313,316],{"className":314,"code":315,"language":56},[54],"echo `openssl enc -d -aes-256-ecb -in \u002Fhome\u002Fsecure_close.key` | openssl aes-256-ecb > \u002Fhome\u002Fsecure_close.key\n",[36,317,315],{"__ignoreMap":59},[11,319,320,321],{},"Avec ",[179,322,181],{},[51,324,327],{"className":325,"code":326,"language":56},[54],"cryptsetup luksDump \u002Fdev\u002Fdebian\u002Fsecure-close\n",[36,328,326],{"__ignoreMap":59},[11,330,331],{},"pour voir quels sont les slots utilisés.puis",[51,333,336],{"className":334,"code":335,"language":56},[54],"cryptsetup luksAddKey \u002Fdev\u002Fdebian\u002Fsecure-closecryptsetup luksDelKey [ancien slot]\n",[36,337,335],{"__ignoreMap":59},[21,339,341],{"id":340},"un-script-pour-le-montage-et-le-démontage-automatique","Un script pour le montage et le démontage automatique",[11,343,344,345,105],{},"Voici un script que vous pouvez utiliser en root ou à l'aide de la\ncommande sudo pour monter et démonter vos partitions chiffrer",[74,346,347],{},[77,348,352],{"href":349,"ariaDescribedBy":350,"dataFootnoteRef":59,"id":351},"#user-content-fn-3",[81],"user-content-fnref-3","3",[51,354,358],{"className":355,"code":356,"language":357,"meta":59,"style":59},"language-bash shiki shiki-themes one-dark-pro","#!\u002Fbin\u002Fsh\n\nif [ -e \u002Fdev\u002Fmapper\u002Fsecure-open ] ; then\n        umount \u002Fhome\u002Fsecure 2> \u002Fdev\u002Fnull\n        if [ $? != 0 ] ; then\n                kdialog --title KSecure --error \"Impossible de démonter le périphérique\"\n        fi\n        if [ -e \u002Fdev\u002Fmapper\u002Fsecure-open ] ; then\n                \u002Fsbin\u002Fcryptsetup remove secure-open\n                kdialog --title KSecure --msgbox \"Suppression du périphérique accomplie\"\n        fi\n    else\n        password=`kdialog --title KSecure --password \"Clé de déchiffrement\"`\n        if [ -z $password ] ; then\n                password=\"nopassword\"\n        fi\n        echo \"$password\" | \\\n        openssl enc -d -aes-256-ecb -in ~\u002Fcompte\u002Fsecure.cle -kfile \u002Fdev\u002Fstdin | \\\n        \u002Fsbin\u002Fcryptsetup create secure-open \u002Fdev\u002Fdebian\u002Fsecure-close 2> \u002Fdev\u002Fnull\n        mount \u002Fhome\u002Fsecure 2> \u002Fdev\u002Fnull\n        if [ $? -ne  0 ] ; then\n                kdialog --title KSecure --error \"Clé incorrecte\"\n                \u002Fsbin\u002Fcryptsetup remove secure-open\n        fi\nfi\n","bash",[36,359,360,369,376,397,414,438,456,462,475,487,502,507,513,540,557,568,573,594,625,644,656,675,689,698,703],{"__ignoreMap":59},[361,362,365],"span",{"class":363,"line":364},"line",1,[361,366,368],{"class":367},"sV9Aq","#!\u002Fbin\u002Fsh\n",[361,370,372],{"class":363,"line":371},2,[361,373,375],{"emptyLinePlaceholder":374},true,"\n",[361,377,379,383,387,391,394],{"class":363,"line":378},3,[361,380,382],{"class":381},"seHd6","if",[361,384,386],{"class":385},"sn6KH"," [ ",[361,388,390],{"class":389},"sjrmR","-e",[361,392,393],{"class":385}," \u002Fdev\u002Fmapper\u002Fsecure-open ] ; ",[361,395,396],{"class":381},"then\n",[361,398,400,404,408,411],{"class":363,"line":399},4,[361,401,403],{"class":402},"sVbv2","        umount",[361,405,407],{"class":406},"subq3"," \u002Fhome\u002Fsecure",[361,409,410],{"class":385}," 2> ",[361,412,413],{"class":406},"\u002Fdev\u002Fnull\n",[361,415,417,420,422,426,429,433,436],{"class":363,"line":416},5,[361,418,419],{"class":381},"        if",[361,421,386],{"class":385},[361,423,425],{"class":424},"sU0A5","$?",[361,427,428],{"class":389}," !=",[361,430,432],{"class":431},"sVC51"," 0",[361,434,435],{"class":385}," ] ; ",[361,437,396],{"class":381},[361,439,441,444,447,450,453],{"class":363,"line":440},6,[361,442,443],{"class":402},"                kdialog",[361,445,446],{"class":431}," --title",[361,448,449],{"class":406}," KSecure",[361,451,452],{"class":431}," --error",[361,454,455],{"class":406}," \"Impossible de démonter le périphérique\"\n",[361,457,459],{"class":363,"line":458},7,[361,460,461],{"class":381},"        fi\n",[361,463,465,467,469,471,473],{"class":363,"line":464},8,[361,466,419],{"class":381},[361,468,386],{"class":385},[361,470,390],{"class":389},[361,472,393],{"class":385},[361,474,396],{"class":381},[361,476,478,481,484],{"class":363,"line":477},9,[361,479,480],{"class":402},"                \u002Fsbin\u002Fcryptsetup",[361,482,483],{"class":406}," remove",[361,485,486],{"class":406}," secure-open\n",[361,488,490,492,494,496,499],{"class":363,"line":489},10,[361,491,443],{"class":402},[361,493,446],{"class":431},[361,495,449],{"class":406},[361,497,498],{"class":431}," --msgbox",[361,500,501],{"class":406}," \"Suppression du périphérique accomplie\"\n",[361,503,505],{"class":363,"line":504},11,[361,506,461],{"class":381},[361,508,510],{"class":363,"line":509},12,[361,511,512],{"class":381},"    else\n",[361,514,516,520,523,526,529,531,534,537],{"class":363,"line":515},13,[361,517,519],{"class":518},"sVyAn","        password",[361,521,522],{"class":389},"=",[361,524,525],{"class":406},"`",[361,527,528],{"class":402},"kdialog",[361,530,446],{"class":431},[361,532,533],{"class":406}," KSecure ",[361,535,536],{"class":431},"--password",[361,538,539],{"class":406}," \"Clé de déchiffrement\"`\n",[361,541,543,545,547,550,553,555],{"class":363,"line":542},14,[361,544,419],{"class":381},[361,546,386],{"class":385},[361,548,549],{"class":389},"-z",[361,551,552],{"class":518}," $password",[361,554,435],{"class":385},[361,556,396],{"class":381},[361,558,560,563,565],{"class":363,"line":559},15,[361,561,562],{"class":518},"                password",[361,564,522],{"class":389},[361,566,567],{"class":406},"\"nopassword\"\n",[361,569,571],{"class":363,"line":570},16,[361,572,461],{"class":381},[361,574,576,579,582,585,588,591],{"class":363,"line":575},17,[361,577,578],{"class":389},"        echo",[361,580,581],{"class":406}," \"",[361,583,584],{"class":518},"$password",[361,586,587],{"class":406},"\"",[361,589,590],{"class":385}," | ",[361,592,593],{"class":389},"\\\n",[361,595,597,600,603,606,609,612,615,618,621,623],{"class":363,"line":596},18,[361,598,599],{"class":402},"        openssl",[361,601,602],{"class":406}," enc",[361,604,605],{"class":431}," -d",[361,607,608],{"class":431}," -aes-256-ecb",[361,610,611],{"class":431}," -in",[361,613,614],{"class":406}," ~\u002Fcompte\u002Fsecure.cle",[361,616,617],{"class":431}," -kfile",[361,619,620],{"class":406}," \u002Fdev\u002Fstdin",[361,622,590],{"class":385},[361,624,593],{"class":389},[361,626,628,631,634,637,640,642],{"class":363,"line":627},19,[361,629,630],{"class":402},"        \u002Fsbin\u002Fcryptsetup",[361,632,633],{"class":406}," create",[361,635,636],{"class":406}," secure-open",[361,638,639],{"class":406}," \u002Fdev\u002Fdebian\u002Fsecure-close",[361,641,410],{"class":385},[361,643,413],{"class":406},[361,645,647,650,652,654],{"class":363,"line":646},20,[361,648,649],{"class":402},"        mount",[361,651,407],{"class":406},[361,653,410],{"class":385},[361,655,413],{"class":406},[361,657,659,661,663,665,668,671,673],{"class":363,"line":658},21,[361,660,419],{"class":381},[361,662,386],{"class":385},[361,664,425],{"class":424},[361,666,667],{"class":389}," -ne",[361,669,670],{"class":431},"  0",[361,672,435],{"class":385},[361,674,396],{"class":381},[361,676,678,680,682,684,686],{"class":363,"line":677},22,[361,679,443],{"class":402},[361,681,446],{"class":431},[361,683,449],{"class":406},[361,685,452],{"class":431},[361,687,688],{"class":406}," \"Clé incorrecte\"\n",[361,690,692,694,696],{"class":363,"line":691},23,[361,693,480],{"class":402},[361,695,483],{"class":406},[361,697,486],{"class":406},[361,699,701],{"class":363,"line":700},24,[361,702,461],{"class":381},[361,704,706],{"class":363,"line":705},25,[361,707,708],{"class":381},"fi\n",[710,711,714,720],"section",{"className":712,"dataFootnotes":59},[713],"footnotes",[715,716,719],"h2",{"className":717,"id":81},[718],"sr-only","Footnotes",[721,722,723,740,749],"ol",{},[29,724,726,727,732,733],{"id":725},"user-content-fn-2","Les différentes commandes sont inspirés du site ",[77,728,729],{"href":729,"rel":730},"http:\u002F\u002Fdocisland.blogspot.com\u002F",[731],"nofollow",". ",[77,734,739],{"href":735,"ariaLabel":736,"className":737,"dataFootnoteBackref":59},"#user-content-fnref-2","Back to reference 1",[738],"data-footnote-backref","↩",[29,741,743,744],{"id":742},"user-content-fn-1","Attention, cela détruira le contenu de la partition que vous assainissez. ",[77,745,739],{"href":746,"ariaLabel":747,"className":748,"dataFootnoteBackref":59},"#user-content-fnref-1","Back to reference 2",[738],[29,750,752,753,755,756],{"id":751},"user-content-fn-3","Vous pourrez trouver un script pour le format ",[179,754,181],{}," dans les commentaires ou dans la partie Script du site. ",[77,757,739],{"href":758,"ariaLabel":759,"className":760,"dataFootnoteBackref":59},"#user-content-fnref-3","Back to reference 3",[738],[762,763,764],"style",{},"html pre.shiki code .sV9Aq, html code.shiki .sV9Aq{--shiki-default:#7F848E;--shiki-default-font-style:italic}html pre.shiki code .seHd6, html code.shiki .seHd6{--shiki-default:#C678DD}html pre.shiki code .sn6KH, html code.shiki .sn6KH{--shiki-default:#ABB2BF}html pre.shiki code .sjrmR, html code.shiki .sjrmR{--shiki-default:#56B6C2}html pre.shiki code .sVbv2, html code.shiki .sVbv2{--shiki-default:#61AFEF}html pre.shiki code .subq3, html code.shiki .subq3{--shiki-default:#98C379}html pre.shiki code .sU0A5, html code.shiki .sU0A5{--shiki-default:#E5C07B}html pre.shiki code .sVC51, html code.shiki .sVC51{--shiki-default:#D19A66}html pre.shiki code .sVyAn, html code.shiki .sVyAn{--shiki-default:#E06C75}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":59,"searchDepth":371,"depth":371,"links":766},[767,768,770,771,772,773,774],{"id":23,"depth":378,"text":24},{"id":71,"depth":378,"text":769},"Préparation de la partition1",{"id":127,"depth":378,"text":128},{"id":258,"depth":378,"text":259},{"id":302,"depth":378,"text":303},{"id":340,"depth":378,"text":341},{"id":81,"depth":371,"text":719},"SysAdmin","sysadmin","2006-08-24",{"type":8,"value":779},[780,782,784],[11,781,13],{},[11,783,16],{},[11,785,19],{},"md","Lille, France",{},"\u002Fpost\u002Fchiffrer-une-partition-d-un-disque",{"title":5,"description":13},"chiffrer-une-partition-d-un-disque","posts\u002FSysAdmin\u002F2006-08-24-chiffrer-une-partition-d-un-disque",[794,795],"debian","script","MUqfUdlUG9slFHhhsbdUUZar_gs50vY5m24eDEqwL4Q",[798,2328,2414,2866,5858],{"id":799,"title":800,"author":6,"body":801,"category":2294,"categorySlug":2295,"date":2296,"description":59,"excerpt":2297,"extension":786,"location":787,"meta":2318,"navigation":374,"path":2319,"published":374,"seo":2320,"slug":2321,"stem":2322,"tags":2323,"timeToRead":509,"__hash__":2327},"posts\u002Fposts\u002FProgrammation\u002F2016-12-10-findsimilarity.md","FindSimilarity - Trouver les différences entre plusieurs vidéos",{"type":8,"value":802,"toc":2282},[803,807,810,813,816,819,824,832,836,839,842,873,876,927,931,934,948,954,962,965,974,977,980,983,1398,1402,1405,1414,1417,1420,1446,1449,1573,1576,1582,1597,1600,1603,2150,2160,2164,2167,2171,2174,2177,2184,2187,2191,2197,2207,2210,2227,2244,2248,2251,2257,2260,2266,2272,2276,2279],[21,804,806],{"id":805},"introduction","Introduction",[11,808,809],{},"Bonjour,",[11,811,812],{},"Je souhaite vous présenter une petite expérience que je viens d'écrire.",[11,814,815],{},"Cela fait plusieurs années que je souhaitais m'amuser sur la librairie OpenCV mais sans jamais en avoir eu l'utilité. J'ai profité d'avoir un peu de temps libre, pour écrire un petit\nprogramme dont le but est de comparer un ensemble de vidéos.",[11,817,818],{},"Le but est ensuite de dire si dans cet ensemble de vidéos, deux vidéos sont identiques, ou se ressemblent, ou sont trop éloignées.",[11,820,821],{},[179,822,823],{},"J'ai souhaité faire cette expérience par amusement, je n'ai donc pas passé beaucoup de temps sur la qualité du code écrit. Ce dernier aurait pu être mieux découpé, posséder des\ncommentaires, des tests unitaires, ... . Si vous voulez utiliser ce code pour un véritable usage production, n'hésitez pas à améliorer celui ci.",[11,825,826,827,831],{},"Vous pouvez trouver le code source de cette expérience à l'adresse suivante : ",[77,828,829],{"href":829,"rel":830},"https:\u002F\u002Fgogs.shadoware.org\u002FShadowareOrg\u002Ffind-similarity",[731],".",[21,833,835],{"id":834},"le-jeux-de-données","Le jeux de données",[11,837,838],{},"J'ai pris plusieurs films en DVD que je possède. Possédant un NAS, et une chromecast, j'encode ces DVD au format vidéo et je les y dépose. Malheureusement la qualité est dégradée\npar rapport au DVD.",[11,840,841],{},"Pour constituer le jeu de données, je prends ces films encodés, que je dépose dans un dossier. Je copie certains d'entre eux telquel",[51,843,845],{"className":355,"code":844,"language":357,"meta":59,"style":59},"mkdir example\ncd example\ncp ..\u002Ffilm1.avi film1_copy.avi\n",[36,846,847,855,862],{"__ignoreMap":59},[361,848,849,852],{"class":363,"line":364},[361,850,851],{"class":402},"mkdir",[361,853,854],{"class":406}," example\n",[361,856,857,860],{"class":363,"line":371},[361,858,859],{"class":389},"cd",[361,861,854],{"class":406},[361,863,864,867,870],{"class":363,"line":378},[361,865,866],{"class":402},"cp",[361,868,869],{"class":406}," ..\u002Ffilm1.avi",[361,871,872],{"class":406}," film1_copy.avi\n",[11,874,875],{},"J'encode certains de ces films avec une résolution différente :",[51,877,879],{"className":355,"code":878,"language":357,"meta":59,"style":59},"avconv -i film2.m4v  -preset veryslow -s 320x240 film2.320x240.m4v\navconv -i film2.m4v  -preset veryslow -s 640x480 film2.640x480.m4v\n",[36,880,881,907],{"__ignoreMap":59},[361,882,883,886,889,892,895,898,901,904],{"class":363,"line":364},[361,884,885],{"class":402},"avconv",[361,887,888],{"class":431}," -i",[361,890,891],{"class":406}," film2.m4v",[361,893,894],{"class":431},"  -preset",[361,896,897],{"class":406}," veryslow",[361,899,900],{"class":431}," -s",[361,902,903],{"class":406}," 320x240",[361,905,906],{"class":406}," film2.320x240.m4v\n",[361,908,909,911,913,915,917,919,921,924],{"class":363,"line":371},[361,910,885],{"class":402},[361,912,888],{"class":431},[361,914,891],{"class":406},[361,916,894],{"class":431},[361,918,897],{"class":406},[361,920,900],{"class":431},[361,922,923],{"class":406}," 640x480",[361,925,926],{"class":406}," film2.640x480.m4v\n",[21,928,930],{"id":929},"comment-fonctionne-la-comparaison","Comment fonctionne la comparaison",[11,932,933],{},"Avant de parler de la comparaison, parlons des fichiers que nous allons comparer. Le programme va se constituer une liste des fichiers à comparer et pour chaque fichier va lire\nles informations suivantes :",[26,935,936,939,942,945],{},[29,937,938],{},"la durée du film",[29,940,941],{},"la largeur",[29,943,944],{},"la hauteur",[29,946,947],{},"une miniature du film (utilisée pour comparer à l'oeil les vidéos)",[11,949,950,951,831],{},"Ensuite, une fois les méta-données récupérées, le programe se constitue une liste de paires de fichiers à comparer en sélectionnant les fichiers qui ont une durée identique à +\u002F- 5\nsecondes. Ce paramètre est modifiable au niveau de la constante ",[36,952,953],{},"DELTA_SEC",[11,955,956,957,831],{},"Enfin vient la comparaison pour laquelle je me suis simplement basé sur les exemples du site OpenCV que vous pouvez trouver dans la rubrique\n",[77,958,961],{"href":959,"rel":960},"http:\u002F\u002Fdocs.opencv.org\u002F2.4\u002Fdoc\u002Ftutorials\u002Fhighgui\u002Fvideo-input-psnr-ssim\u002Fvideo-input-psnr-ssim.html",[731],"Video Input with OpenCV and similarity measurement",[11,963,964],{},"J'ai utilisé l'algorithme PSNR (Peak signal-to-noise ratio) pour déterminer si les deux images de la vidéos sont plutôt proches ou éloignées. Cet algorithme calcul la distorsion\nentre deux images. Il est principalement utilisé pour quantifier la performance réalisée par un encodeur lors de la compression d'une vidéo. Une valeur entre 30 et 50 signifie que\nles images sont relativement proches. Plus la valeur est haute, et plus la qualité d'image est conservée entre les deux images. Si la valeur est inférieure à 30 on peut estimer qu'il\ny a une forte chance pour que les images soit différentes.",[11,966,967,968,973],{},"Vous pouvez retrouver les formules utilisées par le calcul sur le site d'OpenCV ou sur la page ",[77,969,972],{"href":970,"rel":971},"https:\u002F\u002Ffr.wikipedia.org\u002Fwiki\u002FPeak_Signal_to_Noise_Ratio",[731],"Wikipedia",". Est-ce que ce\ncalcul est le meilleur pour trouver les images similaires ? Je ne sais pas. Si vous avez d'autres propositions, on peut les tester.",[11,975,976],{},"Sur une vidéo on a une multitude d'images (sur un film d'une heure et demie à 25 images secondes, nous en avons 135 000), on pourrait comparer chaque image de la vidéo pour se faire\nune moyenne, de mon coté j'ai préféré comparer une image au milieu de la vidéo afin de parcourir plus vite les vidéos.",[11,978,979],{},"De la même manière pour m'abstraire de la taille de la vidéo qui peut avoir été modififée, je redimensionne, à tort ou à raison, les deux images à une taille identique\n(arbitrairement: 160x120).",[11,981,982],{},"Je vous présente donc ci-dessous l'algorithme que vous pouvez retrouver sur le site d'OpenCV. J'ai légèrement modifié l'algorithme pour redimensionner les images ainsi que pour\nretourner une valeur de PSNR infiniment grande quand deux vidéos sont identiques.",[51,984,988],{"className":985,"code":986,"language":987,"meta":59,"style":59},"language-cpp shiki shiki-themes one-dark-pro","double getPSNR(const cv::Mat& F1, const cv::Mat& F2) {\n    cv::Mat I1, I2;\n\n    cv::resize(F1, I1, cv::Size(160, 120));\n    cv::resize(F2, I2, cv::Size(160, 120));\n\n    cv::Mat s1;\n    cv::absdiff(I1, I2, s1);   \u002F\u002F |I1 - I2|\n    s1.convertTo(s1, CV_32F);  \u002F\u002F cannot make a square on 8 bits\n    s1 = s1.mul(s1);           \u002F\u002F |I1 - I2|^2\n\n    cv::Scalar s = sum(s1);    \u002F\u002F sum elements per channel\n\n    double sse = s.val[0] + s.val[1] + s.val[2]; \u002F\u002F sum channels\n\n    if( sse \u003C= 1e-10) {        \u002F\u002F for small values return zero\n        return std::numeric_limits\u003Cdouble>::infinity();\n    } else {\n        double mse  = sse \u002F (double)(I1.channels() * I1.total());\n        double psnr = 10.0 * log10((255 * 255) \u002F mse);\n        return psnr;\n    }\n","cpp",[36,989,990,1033,1038,1042,1069,1090,1094,1099,1112,1128,1149,1153,1168,1172,1232,1236,1265,1290,1301,1349,1386,1393],{"__ignoreMap":59},[361,991,992,995,998,1001,1004,1007,1010,1013,1017,1019,1021,1023,1025,1027,1030],{"class":363,"line":364},[361,993,994],{"class":381},"double",[361,996,997],{"class":402}," getPSNR",[361,999,1000],{"class":385},"(",[361,1002,1003],{"class":381},"const",[361,1005,1006],{"class":385}," cv::",[361,1008,1009],{"class":424},"Mat",[361,1011,1012],{"class":381},"&",[361,1014,1016],{"class":1015},"s_ZVi"," F1",[361,1018,39],{"class":385},[361,1020,1003],{"class":381},[361,1022,1006],{"class":385},[361,1024,1009],{"class":424},[361,1026,1012],{"class":381},[361,1028,1029],{"class":1015}," F2",[361,1031,1032],{"class":385},") {\n",[361,1034,1035],{"class":363,"line":371},[361,1036,1037],{"class":385},"    cv::Mat I1, I2;\n",[361,1039,1040],{"class":363,"line":378},[361,1041,375],{"emptyLinePlaceholder":374},[361,1043,1044,1047,1050,1053,1056,1058,1061,1063,1066],{"class":363,"line":399},[361,1045,1046],{"class":385},"    cv::",[361,1048,1049],{"class":402},"resize",[361,1051,1052],{"class":385},"(F1, I1, cv::",[361,1054,1055],{"class":402},"Size",[361,1057,1000],{"class":385},[361,1059,1060],{"class":431},"160",[361,1062,39],{"class":385},[361,1064,1065],{"class":431},"120",[361,1067,1068],{"class":385},"));\n",[361,1070,1071,1073,1075,1078,1080,1082,1084,1086,1088],{"class":363,"line":416},[361,1072,1046],{"class":385},[361,1074,1049],{"class":402},[361,1076,1077],{"class":385},"(F2, I2, cv::",[361,1079,1055],{"class":402},[361,1081,1000],{"class":385},[361,1083,1060],{"class":431},[361,1085,39],{"class":385},[361,1087,1065],{"class":431},[361,1089,1068],{"class":385},[361,1091,1092],{"class":363,"line":440},[361,1093,375],{"emptyLinePlaceholder":374},[361,1095,1096],{"class":363,"line":458},[361,1097,1098],{"class":385},"    cv::Mat s1;\n",[361,1100,1101,1103,1106,1109],{"class":363,"line":464},[361,1102,1046],{"class":385},[361,1104,1105],{"class":402},"absdiff",[361,1107,1108],{"class":385},"(I1, I2, s1);",[361,1110,1111],{"class":367},"   \u002F\u002F |I1 - I2|\n",[361,1113,1114,1117,1119,1122,1125],{"class":363,"line":477},[361,1115,1116],{"class":424},"    s1",[361,1118,831],{"class":385},[361,1120,1121],{"class":402},"convertTo",[361,1123,1124],{"class":385},"(s1, CV_32F);",[361,1126,1127],{"class":367},"  \u002F\u002F cannot make a square on 8 bits\n",[361,1129,1130,1133,1135,1138,1140,1143,1146],{"class":363,"line":489},[361,1131,1132],{"class":385},"    s1 ",[361,1134,522],{"class":381},[361,1136,1137],{"class":424}," s1",[361,1139,831],{"class":385},[361,1141,1142],{"class":402},"mul",[361,1144,1145],{"class":385},"(s1);",[361,1147,1148],{"class":367},"           \u002F\u002F |I1 - I2|^2\n",[361,1150,1151],{"class":363,"line":504},[361,1152,375],{"emptyLinePlaceholder":374},[361,1154,1155,1158,1160,1163,1165],{"class":363,"line":509},[361,1156,1157],{"class":385},"    cv::Scalar s ",[361,1159,522],{"class":381},[361,1161,1162],{"class":402}," sum",[361,1164,1145],{"class":385},[361,1166,1167],{"class":367},"    \u002F\u002F sum elements per channel\n",[361,1169,1170],{"class":363,"line":515},[361,1171,375],{"emptyLinePlaceholder":374},[361,1173,1174,1177,1180,1182,1185,1187,1190,1193,1196,1199,1202,1204,1206,1208,1210,1212,1214,1216,1218,1220,1222,1224,1226,1229],{"class":363,"line":542},[361,1175,1176],{"class":381},"    double",[361,1178,1179],{"class":385}," sse ",[361,1181,522],{"class":381},[361,1183,1184],{"class":424}," s",[361,1186,831],{"class":385},[361,1188,1189],{"class":518},"val",[361,1191,1192],{"class":385},"[",[361,1194,1195],{"class":431},"0",[361,1197,1198],{"class":385},"] ",[361,1200,1201],{"class":381},"+",[361,1203,1184],{"class":424},[361,1205,831],{"class":385},[361,1207,1189],{"class":518},[361,1209,1192],{"class":385},[361,1211,83],{"class":431},[361,1213,1198],{"class":385},[361,1215,1201],{"class":381},[361,1217,1184],{"class":424},[361,1219,831],{"class":385},[361,1221,1189],{"class":518},[361,1223,1192],{"class":385},[361,1225,104],{"class":431},[361,1227,1228],{"class":385},"];",[361,1230,1231],{"class":367}," \u002F\u002F sum channels\n",[361,1233,1234],{"class":363,"line":559},[361,1235,375],{"emptyLinePlaceholder":374},[361,1237,1238,1241,1244,1247,1250,1253,1256,1259,1262],{"class":363,"line":570},[361,1239,1240],{"class":381},"    if",[361,1242,1243],{"class":385},"( sse ",[361,1245,1246],{"class":381},"\u003C=",[361,1248,1249],{"class":431}," 1",[361,1251,1252],{"class":518},"e",[361,1254,1255],{"class":385},"-",[361,1257,1258],{"class":431},"10",[361,1260,1261],{"class":385},") {",[361,1263,1264],{"class":367},"        \u002F\u002F for small values return zero\n",[361,1266,1267,1270,1273,1276,1279,1281,1284,1287],{"class":363,"line":575},[361,1268,1269],{"class":381},"        return",[361,1271,1272],{"class":385}," std::",[361,1274,1275],{"class":424},"numeric_limits",[361,1277,1278],{"class":385},"\u003C",[361,1280,994],{"class":381},[361,1282,1283],{"class":385},">::",[361,1285,1286],{"class":402},"infinity",[361,1288,1289],{"class":385},"();\n",[361,1291,1292,1295,1298],{"class":363,"line":596},[361,1293,1294],{"class":385},"    } ",[361,1296,1297],{"class":381},"else",[361,1299,1300],{"class":385}," {\n",[361,1302,1303,1306,1309,1311,1313,1316,1319,1321,1324,1327,1329,1332,1335,1338,1341,1343,1346],{"class":363,"line":627},[361,1304,1305],{"class":381},"        double",[361,1307,1308],{"class":385}," mse  ",[361,1310,522],{"class":381},[361,1312,1179],{"class":385},[361,1314,1315],{"class":381},"\u002F",[361,1317,1318],{"class":385}," (",[361,1320,994],{"class":381},[361,1322,1323],{"class":385},")(",[361,1325,1326],{"class":424},"I1",[361,1328,831],{"class":385},[361,1330,1331],{"class":402},"channels",[361,1333,1334],{"class":385},"() ",[361,1336,1337],{"class":381},"*",[361,1339,1340],{"class":424}," I1",[361,1342,831],{"class":385},[361,1344,1345],{"class":402},"total",[361,1347,1348],{"class":385},"());\n",[361,1350,1351,1353,1356,1358,1361,1364,1367,1370,1373,1375,1378,1381,1383],{"class":363,"line":646},[361,1352,1305],{"class":381},[361,1354,1355],{"class":385}," psnr ",[361,1357,522],{"class":381},[361,1359,1360],{"class":431}," 10.0",[361,1362,1363],{"class":381}," *",[361,1365,1366],{"class":402}," log10",[361,1368,1369],{"class":385},"((",[361,1371,1372],{"class":431},"255",[361,1374,1363],{"class":381},[361,1376,1377],{"class":431}," 255",[361,1379,1380],{"class":385},") ",[361,1382,1315],{"class":381},[361,1384,1385],{"class":385}," mse);\n",[361,1387,1388,1390],{"class":363,"line":658},[361,1389,1269],{"class":381},[361,1391,1392],{"class":385}," psnr;\n",[361,1394,1395],{"class":363,"line":677},[361,1396,1397],{"class":385},"    }\n",[21,1399,1401],{"id":1400},"optimisation","Optimisation",[11,1403,1404],{},"La raison qui fait que je voulais m'amuser avec OpenCV c'est qu'il permet de faire ces calculs à l'aide du GPU au lieu du CPU.",[11,1406,1407,1408,1413],{},"L'utilisation du GPU permet d'améliorer la vitesse de calcul pour tout ce qui est traitement d'image, ce pour quoi un GPU est prévu pour. Pour plus d'informations sur\nl'utilisation du GPU dans OpenCV peut être trouvé sur la page ",[77,1409,1412],{"href":1410,"rel":1411},"http:\u002F\u002Fopencv.org\u002Fplatforms\u002Fcuda.html",[731],"CUDA"," d'OpenCV.",[11,1415,1416],{},"Le problème est que sur la version de Debian jessie que j'utilise, OpenCV n'est pas compilé avec CUDA, et ne permet donc pas d'utiliser le GPU. J'ai donc dû compiler ma propre\nversion d'OpenCV.",[11,1418,1419],{},"Pour cela la première étape consiste à récupérer le code source et à se positionner sur la branche que l'on souhaite compiler. Pour ma part je préfère compiler sur la branche 2.4,\nplus proche de la version de Debian.",[51,1421,1423],{"className":355,"code":1422,"language":357,"meta":59,"style":59},"git clone https:\u002F\u002Fgithub.com\u002Fopencv\u002Fopencv.git\ngit checkout 2.4\n",[36,1424,1425,1436],{"__ignoreMap":59},[361,1426,1427,1430,1433],{"class":363,"line":364},[361,1428,1429],{"class":402},"git",[361,1431,1432],{"class":406}," clone",[361,1434,1435],{"class":406}," https:\u002F\u002Fgithub.com\u002Fopencv\u002Fopencv.git\n",[361,1437,1438,1440,1443],{"class":363,"line":371},[361,1439,1429],{"class":402},[361,1441,1442],{"class":406}," checkout",[361,1444,1445],{"class":431}," 2.4\n",[11,1447,1448],{},"Viens ensuite la compilation :",[51,1450,1452],{"className":355,"code":1451,"language":357,"meta":59,"style":59},"mkdir build\ncd build\ncmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=\u002Fhome\u002Fphoenix\u002Fusr\u002Flocal  -DENABLE_SSE=ON -DENABLE_SSE2=ON -DENABLE_SSE3=ON -DWITH_TBB=ON -DWITH_1394=ON -DWITH_V4L=ON -DWITH_OPENGL=ON  -DWITH_GTK=ON -DWITH_JASPER=ON -DWITH_JPEG=ON -DWITH_PNG=ON -DWITH_TIFF=ON  -DWITH_OPENEXR=ON -DWITH_PVAPI=ON   -DWITH_EIGEN=ON -DCMAKE_SKIP_RPATH=ON -D WITH_CUDA=ON -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D WITH_CUBLAS=1 -DWITH_IPP=ON -D CUDA_GENERATION=Auto -D WITH_FFMPEG=ON  ..\u002F\n",[36,1453,1454,1461,1467],{"__ignoreMap":59},[361,1455,1456,1458],{"class":363,"line":364},[361,1457,851],{"class":402},[361,1459,1460],{"class":406}," build\n",[361,1462,1463,1465],{"class":363,"line":371},[361,1464,859],{"class":389},[361,1466,1460],{"class":406},[361,1468,1469,1472,1475,1478,1480,1483,1486,1489,1492,1495,1498,1501,1504,1507,1510,1513,1516,1519,1522,1525,1528,1531,1533,1536,1538,1541,1543,1545,1548,1550,1552,1555,1557,1560,1562,1565,1567,1570],{"class":363,"line":378},[361,1470,1471],{"class":402},"cmake",[361,1473,1474],{"class":431}," -D",[361,1476,1477],{"class":406}," CMAKE_BUILD_TYPE=RELEASE",[361,1479,1474],{"class":431},[361,1481,1482],{"class":406}," CMAKE_INSTALL_PREFIX=\u002Fhome\u002Fphoenix\u002Fusr\u002Flocal",[361,1484,1485],{"class":431},"  -DENABLE_SSE=ON",[361,1487,1488],{"class":431}," -DENABLE_SSE2=ON",[361,1490,1491],{"class":431}," -DENABLE_SSE3=ON",[361,1493,1494],{"class":431}," -DWITH_TBB=ON",[361,1496,1497],{"class":431}," -DWITH_1394=ON",[361,1499,1500],{"class":431}," -DWITH_V4L=ON",[361,1502,1503],{"class":431}," -DWITH_OPENGL=ON",[361,1505,1506],{"class":431},"  -DWITH_GTK=ON",[361,1508,1509],{"class":431}," -DWITH_JASPER=ON",[361,1511,1512],{"class":431}," -DWITH_JPEG=ON",[361,1514,1515],{"class":431}," -DWITH_PNG=ON",[361,1517,1518],{"class":431}," -DWITH_TIFF=ON",[361,1520,1521],{"class":431},"  -DWITH_OPENEXR=ON",[361,1523,1524],{"class":431}," -DWITH_PVAPI=ON",[361,1526,1527],{"class":431},"   -DWITH_EIGEN=ON",[361,1529,1530],{"class":431}," -DCMAKE_SKIP_RPATH=ON",[361,1532,1474],{"class":431},[361,1534,1535],{"class":406}," WITH_CUDA=ON",[361,1537,1474],{"class":431},[361,1539,1540],{"class":406}," ENABLE_FAST_MATH=",[361,1542,83],{"class":431},[361,1544,1474],{"class":431},[361,1546,1547],{"class":406}," CUDA_FAST_MATH=",[361,1549,83],{"class":431},[361,1551,1474],{"class":431},[361,1553,1554],{"class":406}," WITH_CUBLAS=",[361,1556,83],{"class":431},[361,1558,1559],{"class":431}," -DWITH_IPP=ON",[361,1561,1474],{"class":431},[361,1563,1564],{"class":406}," CUDA_GENERATION=Auto",[361,1566,1474],{"class":431},[361,1568,1569],{"class":406}," WITH_FFMPEG=ON",[361,1571,1572],{"class":406},"  ..\u002F\n",[11,1574,1575],{},"J'active lors de la compilation le maximum d'optimisation dont CUDA. J'active également FFMPEG sans lequel le nombre de fichier reconnu baisse énormément sur ma machine. Après\navoir lancé cmake j'obtiens le résultat suivant :",[51,1577,1580],{"className":1578,"code":1579,"language":56},[54],"-- General configuration for OpenCV 2.4.13.1 =====================================\n--   Version control:               2.4.13.1-48-gac118ae\n--\n--   Platform:\n--     Host:                        Linux 3.16.0-4-amd64 x86_64\n--     CMake:                       3.6.2\n--     CMake generator:             Unix Makefiles\n--     CMake build tool:            \u002Fusr\u002Fbin\u002Fmake\n--     Configuration:               RELEASE\n--\n--   C\u002FC++:\n--     Built as dynamic libs?:      YES\n--     C++ Compiler:                \u002Fusr\u002Fbin\u002Fc++  (ver 4.9.2)\n--     C++ flags (Release):         -fsigned-char -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-comment -Wno-array-bounds -Wno-aggressive-loop-optimizations -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffast-math -msse -msse2 -msse3 -ffunction-sections -O3 -DNDEBUG  -DNDEBUG\n--     C++ flags (Debug):           -fsigned-char -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-comment -Wno-array-bounds -Wno-aggressive-loop-optimizations -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffast-math -msse -msse2 -msse3 -ffunction-sections -g  -O0 -DDEBUG -D_DEBUG\n--     C Compiler:                  \u002Fusr\u002Fbin\u002Fcc\n--     C flags (Release):           -fsigned-char -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wno-narrowing -Wno-comment -Wno-array-bounds -Wno-aggressive-loop-optimizations -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffast-math -msse -msse2 -msse3 -ffunction-sections -O3 -DNDEBUG  -DNDEBUG\n--     C flags (Debug):             -fsigned-char -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wno-narrowing -Wno-comment -Wno-array-bounds -Wno-aggressive-loop-optimizations -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffast-math -msse -msse2 -msse3 -ffunction-sections -g  -O0 -DDEBUG -D_DEBUG\n--     Linker flags (Release):\n--     Linker flags (Debug):\n--     ccache:                      NO\n--     Precompiled headers:         YES\n--\n--   OpenCV modules:\n--     To be built:                 core flann imgproc highgui features2d calib3d ml video legacy objdetect photo gpu ocl nonfree contrib java python stitching superres ts videostab\n--     Disabled:                    world\n--     Disabled by dependency:      -\n--     Unavailable:                 androidcamera dynamicuda viz\n--\n--   GUI:\n--     QT:                          NO\n--     GTK+ 2.x:                    YES (ver 2.24.25)\n--     GThread :                    YES (ver 2.42.1)\n--     GtkGlExt:                    NO\n--     OpenGL support:              NO\n--     VTK support:                 NO\n--\n--   Media I\u002FO:\n--     ZLib:                        \u002Fusr\u002Flib\u002Fx86_64-linux-gnu\u002Flibz.so (ver 1.2.8)\n--     JPEG:                        \u002Fusr\u002Flib\u002Fx86_64-linux-gnu\u002Flibjpeg.so (ver )\n--     PNG:                         \u002Fusr\u002Flib\u002Fx86_64-linux-gnu\u002Flibpng.so (ver 1.2.50)\n--     TIFF:                        \u002Fusr\u002Flib\u002Fx86_64-linux-gnu\u002Flibtiff.so (ver 42 - 4.0.3)\n--     JPEG 2000:                   \u002Fusr\u002Flib\u002Fx86_64-linux-gnu\u002Flibjasper.so (ver 1.900.1)\n--     OpenEXR:                     \u002Fusr\u002Flib\u002Fx86_64-linux-gnu\u002FlibImath.so \u002Fusr\u002Flib\u002Fx86_64-linux-gnu\u002FlibIlmImf.so \u002Fusr\u002Flib\u002Fx86_64-linux-gnu\u002FlibIex.so \u002Fusr\u002Flib\u002Fx86_64-linux-gnu\u002FlibHalf.so \u002Fusr\u002Flib\u002Fx86_64-linux-gnu\u002FlibIlmThread.so (ver 1.6.1)\n--\n--   Video I\u002FO:\n--     DC1394 1.x:                  NO\n--     DC1394 2.x:                  YES (ver 2.2.3)\n--     FFMPEG:                      YES\n--       codec:                     YES (ver 56.1.0)\n--       format:                    YES (ver 56.1.0)\n--       util:                      YES (ver 54.3.0)\n--       swscale:                   YES (ver 3.0.0)\n--       resample:                  YES (ver 2.1.0)\n--       gentoo-style:              YES\n--     GStreamer:                   NO\n--     OpenNI:                      NO\n--     OpenNI PrimeSensor Modules:  NO\n--     PvAPI:                       NO\n--     GigEVisionSDK:               NO\n--     UniCap:                      NO\n--     UniCap ucil:                 NO\n--     V4L\u002FV4L2:                    NO\u002FYES\n--     XIMEA:                       NO\n--     Xine:                        NO\n--\n--   Other third-party libraries:\n--     Use IPP:                     IPP not found\n--     Use Eigen:                   NO\n--     Use TBB:                     NO\n--     Use OpenMP:                  NO\n--     Use GCD                      NO\n--     Use Concurrency              NO\n--     Use C=:                      NO\n--     Use Cuda:                    YES (ver 7.5)\n--     Use OpenCL:                  YES\n--\n--   NVIDIA CUDA\n--     Use CUFFT:                   YES\n--     Use CUBLAS:                  YES\n--     USE NVCUVID:                 NO\n--     NVIDIA GPU arch:             21\n--     NVIDIA PTX archs:\n--     Use fast math:               YES\n--     Tiny gpu module:             NO\n--\n--   OpenCL:\n--     Version:                     dynamic\n--     Include path:                \u002Fhome\u002Fphoenix\u002FDeveloppement\u002FExternalSoftware\u002Fopencv\u002F3rdparty\u002Finclude\u002Fopencl\u002F1.2\n--     Use AMD FFT:                 NO\n--     Use AMD BLAS:                NO\n--\n--   Python:\n--     Interpreter:                 \u002Fusr\u002Fbin\u002Fpython2 (ver 2.7.10)\n--     Libraries:                   \u002Fusr\u002Flib\u002Fx86_64-linux-gnu\u002Flibpython2.7.so (ver 2.7.10rc1)\n--     numpy:                       \u002Fusr\u002Flib\u002Fpython2.7\u002Fdist-packages\u002Fnumpy\u002Fcore\u002Finclude (ver 1.8.2)\n--     packages path:               lib\u002Fpython2.7\u002Fdist-packages\n--\n--   Java:\n--     ant:                         \u002Fusr\u002Fbin\u002Fant (ver 1.9.4)\n--     JNI:                         \u002Fusr\u002Flib\u002Fjvm\u002Fjava-7-openjdk-amd64\u002Finclude \u002Fusr\u002Flib\u002Fjvm\u002Fjava-7-openjdk-amd64\u002Finclude \u002Fusr\u002Flib\u002Fjvm\u002Fjava-7-openjdk-amd64\u002Finclude\n--     Java tests:                  YES\n--\n--   Documentation:\n--     Build Documentation:         NO\n--     Sphinx:                      NO\n--     PdfLaTeX compiler:           \u002Fusr\u002Fbin\u002Fpdflatex\n--     Doxygen:                     YES (\u002Fusr\u002Fbin\u002Fdoxygen)\n--\n--   Tests and samples:\n--     Tests:                       YES\n--     Performance tests:           YES\n--     C\u002FC++ Examples:              NO\n--\n--   Install path:                  \u002Fhome\u002Fphoenix\u002Fusr\u002Flocal\n--\n--   cvconfig.h is in:              \u002Fhome\u002Fphoenix\u002FDeveloppement\u002FExternalSoftware\u002Fopencv\u002Fbuild\n-- -----------------------------------------------------------------\n",[36,1581,1579],{"__ignoreMap":59},[11,1583,1584,1585,1588,1589,1592,1593,1596],{},"Pour que la compilation se déroule sans problème, il vous faudra installer certains paquets sur votre distribution. Sur Debian Jessie, j'ai installé ",[36,1586,1587],{},"nvidia-cuda-toolkit"," en\nversion ",[36,1590,1591],{},"7.5.18-4~bpo8+1",". Comme vous pouvez les voir c'est une version qui provient du repository de backports. La version ",[36,1594,1595],{},"6.0.37-5"," ne me permettait pas d'activer CUDA. J'ai\ndonc du monter l'ensemble du driver propriétaire sur mon poste de développement.",[11,1598,1599],{},"Rasssurez-vous, si vous ne voulez pas utiliser les backports ou ne pas utiliser de driver propriétaire, vous pouvez tester le programme dans sa version CPU. :)",[11,1601,1602],{},"Voici comment le code a été ré-écrit pour utiliser le GPU à la place du CPU:",[51,1604,1606],{"className":985,"code":1605,"language":987,"meta":59,"style":59},"struct BufferPSNR {                                    \u002F\u002F Optimized GPU versions\n    \u002F\u002F Data allocations are very expensive on GPU. Use a buffer to solve: allocate once reuse later.\n    cv::gpu::GpuMat gF1, gF2, gI1, gI2, gs, t1,t2;\n\n    cv::gpu::GpuMat buf;\n};\n\ndouble getPSNR_GPU_optimized(const cv::Mat& F1, const cv::Mat& F2, BufferPSNR& b) {\n    b.gF1.upload(F1);\n    b.gF2.upload(F2);\n\n    cv::gpu::resize(b.gF1, b.gI1, cv::Size(160, 120));\n    cv::gpu::resize(b.gF2, b.gI2, cv::Size(160, 120));\n\n    b.gI1.convertTo(b.t1, CV_32F);\n    b.gI2.convertTo(b.t2, CV_32F);\n\n    cv::gpu::absdiff(b.t1.reshape(1), b.t2.reshape(1), b.gs);\n    cv::gpu::multiply(b.gs, b.gs, b.gs);\n\n    double sse = cv::gpu::sum(b.gs, b.buf)[0];\n\n    if( sse \u003C= 1e-10) \u002F\u002F for small values return zero\n        return std::numeric_limits\u003Cdouble>::infinity();\n    else {\n        double mse = sse \u002F(double)(F1.channels() * F1.total());\n        double psnr = 10.0*log10((255*255)\u002Fmse);\n        return psnr;\n    }\n}\n",[36,1607,1608,1622,1627,1632,1636,1641,1646,1650,1693,1711,1727,1731,1776,1817,1821,1845,1868,1872,1928,1965,1969,2011,2015,2037,2055,2062,2101,2132,2139,2144],{"__ignoreMap":59},[361,1609,1610,1613,1616,1619],{"class":363,"line":364},[361,1611,1612],{"class":381},"struct",[361,1614,1615],{"class":424}," BufferPSNR",[361,1617,1618],{"class":385}," {",[361,1620,1621],{"class":367},"                                    \u002F\u002F Optimized GPU versions\n",[361,1623,1624],{"class":363,"line":371},[361,1625,1626],{"class":367},"    \u002F\u002F Data allocations are very expensive on GPU. Use a buffer to solve: allocate once reuse later.\n",[361,1628,1629],{"class":363,"line":378},[361,1630,1631],{"class":385},"    cv::gpu::GpuMat gF1, gF2, gI1, gI2, gs, t1,t2;\n",[361,1633,1634],{"class":363,"line":399},[361,1635,375],{"emptyLinePlaceholder":374},[361,1637,1638],{"class":363,"line":416},[361,1639,1640],{"class":385},"    cv::gpu::GpuMat buf;\n",[361,1642,1643],{"class":363,"line":440},[361,1644,1645],{"class":385},"};\n",[361,1647,1648],{"class":363,"line":458},[361,1649,375],{"emptyLinePlaceholder":374},[361,1651,1652,1654,1657,1659,1661,1663,1665,1667,1669,1671,1673,1675,1677,1679,1681,1683,1686,1688,1691],{"class":363,"line":464},[361,1653,994],{"class":381},[361,1655,1656],{"class":402}," getPSNR_GPU_optimized",[361,1658,1000],{"class":385},[361,1660,1003],{"class":381},[361,1662,1006],{"class":385},[361,1664,1009],{"class":424},[361,1666,1012],{"class":381},[361,1668,1016],{"class":1015},[361,1670,39],{"class":385},[361,1672,1003],{"class":381},[361,1674,1006],{"class":385},[361,1676,1009],{"class":424},[361,1678,1012],{"class":381},[361,1680,1029],{"class":1015},[361,1682,39],{"class":385},[361,1684,1685],{"class":424},"BufferPSNR",[361,1687,1012],{"class":381},[361,1689,1690],{"class":1015}," b",[361,1692,1032],{"class":385},[361,1694,1695,1698,1700,1703,1705,1708],{"class":363,"line":477},[361,1696,1697],{"class":424},"    b",[361,1699,831],{"class":385},[361,1701,1702],{"class":424},"gF1",[361,1704,831],{"class":385},[361,1706,1707],{"class":402},"upload",[361,1709,1710],{"class":385},"(F1);\n",[361,1712,1713,1715,1717,1720,1722,1724],{"class":363,"line":489},[361,1714,1697],{"class":424},[361,1716,831],{"class":385},[361,1718,1719],{"class":424},"gF2",[361,1721,831],{"class":385},[361,1723,1707],{"class":402},[361,1725,1726],{"class":385},"(F2);\n",[361,1728,1729],{"class":363,"line":504},[361,1730,375],{"emptyLinePlaceholder":374},[361,1732,1733,1735,1738,1741,1743,1745,1748,1750,1752,1754,1756,1758,1761,1764,1766,1768,1770,1772,1774],{"class":363,"line":509},[361,1734,1046],{"class":385},[361,1736,1737],{"class":424},"gpu",[361,1739,1740],{"class":385},"::",[361,1742,1049],{"class":402},[361,1744,1000],{"class":385},[361,1746,1747],{"class":424},"b",[361,1749,831],{"class":385},[361,1751,1702],{"class":518},[361,1753,39],{"class":385},[361,1755,1747],{"class":424},[361,1757,831],{"class":385},[361,1759,1760],{"class":518},"gI1",[361,1762,1763],{"class":385},", cv::",[361,1765,1055],{"class":402},[361,1767,1000],{"class":385},[361,1769,1060],{"class":431},[361,1771,39],{"class":385},[361,1773,1065],{"class":431},[361,1775,1068],{"class":385},[361,1777,1778,1780,1782,1784,1786,1788,1790,1792,1794,1796,1798,1800,1803,1805,1807,1809,1811,1813,1815],{"class":363,"line":515},[361,1779,1046],{"class":385},[361,1781,1737],{"class":424},[361,1783,1740],{"class":385},[361,1785,1049],{"class":402},[361,1787,1000],{"class":385},[361,1789,1747],{"class":424},[361,1791,831],{"class":385},[361,1793,1719],{"class":518},[361,1795,39],{"class":385},[361,1797,1747],{"class":424},[361,1799,831],{"class":385},[361,1801,1802],{"class":518},"gI2",[361,1804,1763],{"class":385},[361,1806,1055],{"class":402},[361,1808,1000],{"class":385},[361,1810,1060],{"class":431},[361,1812,39],{"class":385},[361,1814,1065],{"class":431},[361,1816,1068],{"class":385},[361,1818,1819],{"class":363,"line":542},[361,1820,375],{"emptyLinePlaceholder":374},[361,1822,1823,1825,1827,1829,1831,1833,1835,1837,1839,1842],{"class":363,"line":559},[361,1824,1697],{"class":424},[361,1826,831],{"class":385},[361,1828,1760],{"class":424},[361,1830,831],{"class":385},[361,1832,1121],{"class":402},[361,1834,1000],{"class":385},[361,1836,1747],{"class":424},[361,1838,831],{"class":385},[361,1840,1841],{"class":518},"t1",[361,1843,1844],{"class":385},", CV_32F);\n",[361,1846,1847,1849,1851,1853,1855,1857,1859,1861,1863,1866],{"class":363,"line":570},[361,1848,1697],{"class":424},[361,1850,831],{"class":385},[361,1852,1802],{"class":424},[361,1854,831],{"class":385},[361,1856,1121],{"class":402},[361,1858,1000],{"class":385},[361,1860,1747],{"class":424},[361,1862,831],{"class":385},[361,1864,1865],{"class":518},"t2",[361,1867,1844],{"class":385},[361,1869,1870],{"class":363,"line":575},[361,1871,375],{"emptyLinePlaceholder":374},[361,1873,1874,1876,1878,1880,1882,1884,1886,1888,1890,1892,1895,1897,1899,1902,1904,1906,1908,1910,1912,1914,1916,1918,1920,1922,1925],{"class":363,"line":596},[361,1875,1046],{"class":385},[361,1877,1737],{"class":424},[361,1879,1740],{"class":385},[361,1881,1105],{"class":402},[361,1883,1000],{"class":385},[361,1885,1747],{"class":424},[361,1887,831],{"class":385},[361,1889,1841],{"class":424},[361,1891,831],{"class":385},[361,1893,1894],{"class":402},"reshape",[361,1896,1000],{"class":385},[361,1898,83],{"class":431},[361,1900,1901],{"class":385},"), ",[361,1903,1747],{"class":424},[361,1905,831],{"class":385},[361,1907,1865],{"class":424},[361,1909,831],{"class":385},[361,1911,1894],{"class":402},[361,1913,1000],{"class":385},[361,1915,83],{"class":431},[361,1917,1901],{"class":385},[361,1919,1747],{"class":424},[361,1921,831],{"class":385},[361,1923,1924],{"class":518},"gs",[361,1926,1927],{"class":385},");\n",[361,1929,1930,1932,1934,1936,1939,1941,1943,1945,1947,1949,1951,1953,1955,1957,1959,1961,1963],{"class":363,"line":627},[361,1931,1046],{"class":385},[361,1933,1737],{"class":424},[361,1935,1740],{"class":385},[361,1937,1938],{"class":402},"multiply",[361,1940,1000],{"class":385},[361,1942,1747],{"class":424},[361,1944,831],{"class":385},[361,1946,1924],{"class":518},[361,1948,39],{"class":385},[361,1950,1747],{"class":424},[361,1952,831],{"class":385},[361,1954,1924],{"class":518},[361,1956,39],{"class":385},[361,1958,1747],{"class":424},[361,1960,831],{"class":385},[361,1962,1924],{"class":518},[361,1964,1927],{"class":385},[361,1966,1967],{"class":363,"line":646},[361,1968,375],{"emptyLinePlaceholder":374},[361,1970,1971,1973,1975,1977,1979,1981,1983,1986,1988,1990,1992,1994,1996,1998,2000,2003,2006,2008],{"class":363,"line":658},[361,1972,1176],{"class":381},[361,1974,1179],{"class":385},[361,1976,522],{"class":381},[361,1978,1006],{"class":385},[361,1980,1737],{"class":424},[361,1982,1740],{"class":385},[361,1984,1985],{"class":402},"sum",[361,1987,1000],{"class":385},[361,1989,1747],{"class":424},[361,1991,831],{"class":385},[361,1993,1924],{"class":518},[361,1995,39],{"class":385},[361,1997,1747],{"class":424},[361,1999,831],{"class":385},[361,2001,2002],{"class":518},"buf",[361,2004,2005],{"class":385},")[",[361,2007,1195],{"class":431},[361,2009,2010],{"class":385},"];\n",[361,2012,2013],{"class":363,"line":677},[361,2014,375],{"emptyLinePlaceholder":374},[361,2016,2017,2019,2021,2023,2025,2027,2029,2031,2034],{"class":363,"line":691},[361,2018,1240],{"class":381},[361,2020,1243],{"class":385},[361,2022,1246],{"class":381},[361,2024,1249],{"class":431},[361,2026,1252],{"class":518},[361,2028,1255],{"class":385},[361,2030,1258],{"class":431},[361,2032,2033],{"class":385},")",[361,2035,2036],{"class":367}," \u002F\u002F for small values return zero\n",[361,2038,2039,2041,2043,2045,2047,2049,2051,2053],{"class":363,"line":700},[361,2040,1269],{"class":381},[361,2042,1272],{"class":385},[361,2044,1275],{"class":424},[361,2046,1278],{"class":385},[361,2048,994],{"class":381},[361,2050,1283],{"class":385},[361,2052,1286],{"class":402},[361,2054,1289],{"class":385},[361,2056,2057,2060],{"class":363,"line":705},[361,2058,2059],{"class":381},"    else",[361,2061,1300],{"class":385},[361,2063,2065,2067,2070,2072,2074,2076,2078,2080,2082,2085,2087,2089,2091,2093,2095,2097,2099],{"class":363,"line":2064},26,[361,2066,1305],{"class":381},[361,2068,2069],{"class":385}," mse ",[361,2071,522],{"class":381},[361,2073,1179],{"class":385},[361,2075,1315],{"class":381},[361,2077,1000],{"class":385},[361,2079,994],{"class":381},[361,2081,1323],{"class":385},[361,2083,2084],{"class":424},"F1",[361,2086,831],{"class":385},[361,2088,1331],{"class":402},[361,2090,1334],{"class":385},[361,2092,1337],{"class":381},[361,2094,1016],{"class":424},[361,2096,831],{"class":385},[361,2098,1345],{"class":402},[361,2100,1348],{"class":385},[361,2102,2104,2106,2108,2110,2112,2114,2117,2119,2121,2123,2125,2127,2129],{"class":363,"line":2103},27,[361,2105,1305],{"class":381},[361,2107,1355],{"class":385},[361,2109,522],{"class":381},[361,2111,1360],{"class":431},[361,2113,1337],{"class":381},[361,2115,2116],{"class":402},"log10",[361,2118,1369],{"class":385},[361,2120,1372],{"class":431},[361,2122,1337],{"class":381},[361,2124,1372],{"class":431},[361,2126,2033],{"class":385},[361,2128,1315],{"class":381},[361,2130,2131],{"class":385},"mse);\n",[361,2133,2135,2137],{"class":363,"line":2134},28,[361,2136,1269],{"class":381},[361,2138,1392],{"class":385},[361,2140,2142],{"class":363,"line":2141},29,[361,2143,1397],{"class":385},[361,2145,2147],{"class":363,"line":2146},30,[361,2148,2149],{"class":385},"}\n",[11,2151,2152,2153,2155,2156,2159],{},"L'utilisation de la structure ",[36,2154,1685],{}," permet de ne pas perdre de performance lors de l'initialisation relativement lourde des objets ",[36,2157,2158],{},"GpuMat",". Sans cela, l'utilisation du Gpu\nserait moins performant que la version Cpu.",[21,2161,2163],{"id":2162},"lexpérience","L'expérience",[11,2165,2166],{},"Maintenant place à l'expérience. Nous allons lancer notre programme sur notre jeu d'essai comprenant les vidéos issue des DVD, ainsi que les vidéos recompressées pour l'expérience.\nSi l'expérence se déroule bien l'algorithme devrait nous detecter les fichiers dupliqués, ainsi que les fichiers recompressés.",[715,2168,2170],{"id":2169},"lancement-et-selection-des-dossiers","Lancement et selection des dossiers",[11,2172,2173],{},"La première étape est la sélection des dossiers que l'on souhaite comparer. Le programme ira lire récursivement l'ensemble des dossiers pour y trouver l'ensemble des fichiers\nvidéos.",[11,2175,2176],{},"La sélection d'un projet provient de mon envie de départ de pouvoir enregistrer l'avancement du projet au fur et à mesure. Cette étape n'a pas été réalisée mais l'existance du mode\nprojet existe toujours.",[11,2178,2179],{},[2180,2181],"img",{"alt":2182,"src":2183},"Selection du projet","\u002FProgrammation\u002Ffind-similarity\u002Ffind-similarity-1.png",[11,2185,2186],{},"Une fois le dossier projet choisi, il faut sélectionner la liste des dossiers contenant les vidéos et lancer le programme ...",[715,2188,2190],{"id":2189},"comparaison-des-vidéos","Comparaison des vidéos",[11,2192,2193,2194,831],{},"Dans cette étape le programme compare l'ensemble des vidéos présentes dans les dossiers. L'ensemble du processus tourne dans des threads afin de ne pas figer l'IHM, grâce à l'API\n",[36,2195,2196],{},"QtConcurrent",[11,2198,2199,2203],{},[2180,2200],{"alt":2201,"src":2202},"Recherche","\u002FProgrammation\u002Ffind-similarity\u002Ffind-similarity-2.png",[2180,2204],{"alt":2205,"src":2206},"Recherche encore","\u002FProgrammation\u002Ffind-similarity\u002Ffind-similarity-3.png",[11,2208,2209],{},"Les étapes de la recherche sont donc :",[26,2211,2212,2215,2218,2221,2224],{},[29,2213,2214],{},"Constitution de la liste des fichiers",[29,2216,2217],{},"Récupération des méta-données",[29,2219,2220],{},"Création de la liste des paires de fichiers (en filtrant sur la durée)",[29,2222,2223],{},"Calcul du PSNR pour chaque paire de fichiers",[29,2225,2226],{},"Filtrage pour ne garder que les paires de fichiers dont le PSNR est supérieur à 30 db.",[11,2228,2229,2230,2232,2233,2235,2236,2239,2240,2243],{},"Lors de mon développement je me suis basé sur l'API ",[36,2231,2196],{}," pour faire les différentes étapes. Faisant beaucoup de développement NodeJS ces derniers temps je suis habitué à\nl'utilisation des promesses et de leur enchainement pour faire des processus complexes. J'ai trouvé dommage de ne pas retrouver la même chose dans l'API ",[36,2234,2196],{},". Pour\nreproduire un équivalent, lorsqu'un ",[36,2237,2238],{},"QFuture","se termine, le signal émis par ",[36,2241,2242],{},"QFutureWatcher"," est récupérer par un SLOT du moteur qui s'occupe de lancer l'étape suivante.",[715,2245,2247],{"id":2246},"la-page-de-résultat","La page de résultat",[11,2249,2250],{},"La page de résultat liste les vidéos considérées identiques suite à l'étude d'une des images. Un coup d'oeil visuel permet alors de se faire un avis sur la question, et de\nsupprimer la vidéo que l'on souhaite.",[11,2252,2253],{},[2180,2254],{"alt":2255,"src":2256},"Résultat 1","\u002FProgrammation\u002Ffind-similarity\u002Ffind-similarity-4.png",[11,2258,2259],{},"Comme on peut le voir le programme retrouve les vidéos dont l'image est identique, ainsi que les films qui ont été redimensionnés sans trop de soucis.\nLe problème se situe alors au niveau du bruit qui est généré. Plusieurs films sont considérés comme proches alors que complètement différents. Pour régler ce problème, comparer\nplusieurs images d'une même vidéo à des timestamps différents pourrait peut-être régler le problème.",[11,2261,2262],{},[2180,2263],{"alt":2264,"src":2265},"Résultat 2","\u002FProgrammation\u002Ffind-similarity\u002Ffind-similarity-5.png",[11,2267,2268],{},[2269,2270,2271],"strong",{},"Je vous conseille de vérifier manuellement la qualité et la similarité de chaque vidéo manuellement avant toute suppression.",[21,2273,2275],{"id":2274},"conclusion","Conclusion",[11,2277,2278],{},"En conclusion, j'ai trouvé l'expérience intéressante, et maintenant qu'elle est terminée, je vais pouvoir en tenter une autre ;). Est-ce que le programme continuera d'évoluer ?\nPourquoi pas ? Cela dépendera des PR (Pull Request) et des demandes faites par les utilisateurs, ainsi que du temps que j'ai envie de passer dessus.",[762,2280,2281],{},"html pre.shiki code .sVbv2, html code.shiki .sVbv2{--shiki-default:#61AFEF}html pre.shiki code .subq3, html code.shiki .subq3{--shiki-default:#98C379}html pre.shiki code .sjrmR, html code.shiki .sjrmR{--shiki-default:#56B6C2}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sVC51, html code.shiki .sVC51{--shiki-default:#D19A66}html pre.shiki code .seHd6, html code.shiki .seHd6{--shiki-default:#C678DD}html pre.shiki code .sn6KH, html code.shiki .sn6KH{--shiki-default:#ABB2BF}html pre.shiki code .sU0A5, html code.shiki .sU0A5{--shiki-default:#E5C07B}html pre.shiki code .s_ZVi, html code.shiki .s_ZVi{--shiki-default:#E06C75;--shiki-default-font-style:italic}html pre.shiki code .sV9Aq, html code.shiki .sV9Aq{--shiki-default:#7F848E;--shiki-default-font-style:italic}html pre.shiki code .sVyAn, html code.shiki .sVyAn{--shiki-default:#E06C75}",{"title":59,"searchDepth":371,"depth":371,"links":2283},[2284,2285,2286,2287,2288,2289,2290,2291],{"id":805,"depth":378,"text":806},{"id":834,"depth":378,"text":835},{"id":929,"depth":378,"text":930},{"id":1400,"depth":378,"text":1401},{"id":2162,"depth":378,"text":2163},{"id":2169,"depth":371,"text":2170},{"id":2189,"depth":371,"text":2190},{"id":2246,"depth":371,"text":2247,"children":2292},[2293],{"id":2274,"depth":378,"text":2275},"Programmation","programmation","2016-12-10",{"type":8,"value":2298},[2299,2301,2303,2305,2307,2309,2313],[21,2300,806],{"id":805},[11,2302,809],{},[11,2304,812],{},[11,2306,815],{},[11,2308,818],{},[11,2310,2311],{},[179,2312,823],{},[11,2314,826,2315,831],{},[77,2316,829],{"href":829,"rel":2317},[731],{"planet":374},"\u002Fpost\u002Ffindsimilarity",{"title":800,"description":59},"findsimilarity","posts\u002FProgrammation\u002F2016-12-10-findsimilarity",[2324,2325,2326,794],"qt","opencv","video","LR-Ko6CoDmyd4rJj7msRVs_pkiaov-yO2_RYmY_C6cE",{"id":2329,"title":2330,"author":6,"body":2331,"category":2385,"categorySlug":2386,"date":2387,"description":2335,"excerpt":2388,"extension":786,"location":787,"meta":2406,"navigation":374,"path":2407,"published":374,"seo":2408,"slug":2409,"stem":2410,"tags":2411,"timeToRead":371,"__hash__":2413},"posts\u002Fposts\u002FLogiciels\u002F2009-04-11-kde4-devient-instable.md","KDE4 devient instable ...",{"type":8,"value":2332,"toc":2383},[2333,2336,2339,2353,2360,2363,2377,2380],[11,2334,2335],{},"Title: KDE4 devient instable ...\nTags: debian, kde, qt",[11,2337,2338],{},"Titre trolleur, cela ne veux pas dire que KDE 4 est moins stable\nqu'avant mais qu'il a passé une étape supplémentaire chez Debian.",[11,2340,2341,2342,2345,2346,2349,2350,831],{},"Voilà quelques jours déjà que la distribution ",[2269,2343,2344],{},"Gnu\u002FDebian"," intègre\n",[2269,2347,2348],{},"KDE 4"," dans sa version instable. C'est une grande nouvelle car cela\nva permettre à toute les personnes se trouvant en instable et n'ayant\npas touchées à la branche expérimental de Debian de pouvoir tester ",[2269,2351,2352],{},"KDE\n4",[11,2354,2355,2356,2359],{},"Malheureusement pour les ",[179,2357,2358],{},"traumatisé de KDE 4",", l'intégration de ce\ndernier remplace KDE 3.5 et ne viens pas se positionner en parallèle. Il\nme semble pourtant que lors du passage de KDE 2 à KDE 3, il était\npossible d'avoir les deux bureaux en même temps sur sa machine et de\nswitcher de l'un à l'autre sans difficulté. Cela signifie donc peut-être\naussi la perte d'utilisateur pour KDE sous Gnu\u002FDebian au profit d'un\nautre environnement de bureau.",[11,2361,2362],{},"Afin d'effectuer la migration en douceur, Gnu\u002FDebian propose un\nassistant de migration de KDE du nom de Kaboom. Cet assistant, démarrer\nlors de la première connexion de l'utilisateur et vous propose alors de\nsauvegarder votre ancien dossier de configuration KDE 3 et de migrer le\ndossier .kde vers la version 4.",[11,2364,2365,2369,2373],{},[2180,2366],{"alt":2367,"src":2368},"kaboom1","\u002FLogiciels\u002Fkde4-devient-instable\u002Fkaboom1_s.jpg",[2180,2370],{"alt":2371,"src":2372},"kaboom2","\u002FLogiciels\u002Fkde4-devient-instable\u002Fkaboom2_s.jpg",[2180,2374],{"alt":2375,"src":2376},"kaboom3","\u002FLogiciels\u002Fkde4-devient-instable\u002Fkaboom3_s.jpg",[11,2378,2379],{},"Je viens donc de passer à KDE 4 et m'émerveille des nouvelles\nfonctionnalités de KWin (cube, placement des fenêtres) que je n'avais\npas avant, car n'avait jamais installé Compiz ...",[11,2381,2382],{},"Bonne installation,",{"title":59,"searchDepth":371,"depth":371,"links":2384},[],"Logiciels","logiciels","2009-04-11",{"type":8,"value":2389},[2390,2392,2394,2402],[11,2391,2335],{},[11,2393,2338],{},[11,2395,2341,2396,2345,2398,2349,2400,831],{},[2269,2397,2344],{},[2269,2399,2348],{},[2269,2401,2352],{},[11,2403,2355,2404,2359],{},[179,2405,2358],{},{},"\u002Fpost\u002Fkde4-devient-instable",{"title":2330,"description":2335},"kde4-devient-instable","posts\u002FLogiciels\u002F2009-04-11-kde4-devient-instable",[794,2412,2324],"kde","Oj3jqh3sY77Ym6LYJ2tDQUMs5alVjGgGLz0JxRhI7k8",{"id":2415,"title":2416,"author":6,"body":2417,"category":2430,"categorySlug":2839,"date":2840,"description":59,"excerpt":2841,"extension":786,"location":787,"meta":2857,"navigation":374,"path":2858,"published":374,"seo":2859,"slug":2860,"stem":2861,"tags":2862,"timeToRead":399,"__hash__":2865},"posts\u002Fposts\u002FXINX\u002F2009-03-06-xinx-0.8.0.0.md","XINX 0.8.0.0",{"type":8,"value":2418,"toc":2832},[2419,2425,2431,2439,2442,2450,2453,2456,2460,2471,2478,2481,2486,2492,2509,2513,2519,2522,2525,2529,2534,2542,2729,2739,2743,2746,2754,2758,2762,2774,2777,2781,2784,2790,2793,2823,2829],[11,2420,2421],{},[2180,2422],{"alt":2423,"src":2424},"Editeur","\u002FXINX\u002Fxinx-0.8.0.0\u002Fediteur_de_texte.png",[11,2426,2427,2428,831],{},"J'ai le plaisir de vous annoncer la sortie de la nouvelle version de\n",[2269,2429,2430],{},"XINX",[11,2432,2433,2435,2436,831],{},[2269,2434,2430],{}," est un éditeur de projet web basé sur les technologies XSL,\nHTML, CSS, JavaScript. Il possède un mode projet permettant de dériver\nles projets à la manière des consultants GCE de l'entreprise ",[179,2437,2438],{},"Generix\nGroup",[11,2440,2441],{},"Cette dernière version a mis beaucoup de temps pour sortir et est moins\ncomplète que celle que je souhaitais faire à l'origine. Cela viens de\nplusieurs raison :",[26,2443,2444,2447],{},[29,2445,2446],{},"de gros changement interne",[29,2448,2449],{},"moins de temps le soir et le week-end.",[11,2451,2452],{},"La prochaine version 0.8.1 contiendra les développements que je n'ai pu\nmettre dans cette version. N'hésitez pas à faire un retour sur les\nproblèmes que vous rencontrez pour que ces derniers soit également\ncorriger pour la prochaine version.",[11,2454,2455],{},"Nous allons détailler ci-dessous les différentes amélioration incluse\ndans cette version.",[21,2457,2459],{"id":2458},"qcodeedit-le-nouvel-éditeur","QCodeEdit - Le nouvel éditeur",[11,2461,2462,2463,2466,2467,2470],{},"L'éditeur de texte de cette version a complètement été remplacé. On est\npassé de QTextEdit (",[179,2464,2465],{},"éditeur de texte de Qt Software",") à QCodeEdit\n(",[179,2468,2469],{},"Développé par Luc Bruant aka fullmetalcoder","). Heureusement que les\nAPIs de ces deux éditeurs sont très similaire ce qui a permis\nd'effectuer les changements assez rapidement (quelques mois au lieu de\nquelques années ;) ).",[11,2472,2473,2474,2477],{},"Je tiens également à remercier ",[179,2475,2476],{},"fullmetalcoder"," de sa réactivité sur le\ndéveloppement de QCodeEdit.",[11,2479,2480],{},"Les nouveautés qu'apportent ce nouvel éditeur par rapport à QTextEdit\nsont :",[26,2482,2483],{},[29,2484,2485],{},"le folding",[11,2487,2488],{},[2180,2489],{"alt":2490,"src":2491},"Mark","\u002FXINX\u002Fxinx-0.8.0.0\u002Fmarqueur.png",[26,2493,2494,2497,2503,2506],{},[29,2495,2496],{},"les couleurs de fond sur les marque pages et les erreurs (pour une\nplus grande clarté).",[29,2498,2499,2500,2033],{},"un chargement plus rapide des fichiers (exemple :\n",[36,2501,2502],{},"configuration.xml",[29,2504,2505],{},"pourvoir faire des sélections verticales (à l'aide de Ctrl+Shift)\ncomme le font certain éditeurs",[29,2507,2508],{},"afficher les correspondances de parenthèses",[21,2510,2512],{"id":2511},"test-du-xpath","Test du XPATH",[11,2514,2515],{},[2180,2516],{"alt":2517,"src":2518},"X-Quey","\u002FXINX\u002Fxinx-0.8.0.0\u002Fxpath.png",[11,2520,2521],{},"Cette boite de dialogue permet d'exécuter un X-PATH (ou une requête\nXQuery) sur un fichier de présentation. Cela permet de tester rapidement\nles X-PATH compliqué avant de lancer la page sous le navigateur.",[11,2523,2524],{},"Il est possible de saisir des X-PATH relativement à un X-PATH\nsélectionné dans le flux de présentation ou de manière absolu.",[21,2526,2528],{"id":2527},"script-automatique","Script automatique",[11,2530,2531,2533],{},[2269,2532,2430],{}," permet également d'appeler un script lors de la sauvegarde d'un\nfichier. Pour cela un nouvel objet permettant de modifier le contenue de\nl'éditeur plus facilement a été créé.Comme exemple à la sauvegarde de\nscript ont été mis à jours :",[26,2535,2536,2539],{},[29,2537,2538],{},"La mise à jours des key('url-param','') par des X-PATH",[29,2540,2541],{},"La mise à jours du nom du fichier dans les feuilles de styles.",[51,2543,2547],{"className":2544,"code":2545,"language":2546,"meta":59,"style":59},"language-javascript shiki shiki-themes one-dark-pro","obj.beforeSave = function() {\n  this.run();\n};\n\nobj.run = function() {\n  var search = new DocumentSearch(textEdit);\n\n  search.options.regExp = true;\n  search.searchText = \"key\\\\('url-param', '(.*)'\\\\)\";\n  search.replaceText =\n    \"\u002Flayout_data\u002Fapplication_data\u002Ftemporaire\u002Fparam[@name='\\\\1']\";\n\n  while (search.next()) {}\n};\n","javascript",[36,2548,2549,2568,2580,2584,2588,2602,2625,2629,2652,2679,2691,2703,2707,2725],{"__ignoreMap":59},[361,2550,2551,2554,2556,2559,2562,2565],{"class":363,"line":364},[361,2552,2553],{"class":424},"obj",[361,2555,831],{"class":385},[361,2557,2558],{"class":402},"beforeSave",[361,2560,2561],{"class":389}," =",[361,2563,2564],{"class":381}," function",[361,2566,2567],{"class":385},"() {\n",[361,2569,2570,2573,2575,2578],{"class":363,"line":371},[361,2571,2572],{"class":424},"  this",[361,2574,831],{"class":385},[361,2576,2577],{"class":402},"run",[361,2579,1289],{"class":385},[361,2581,2582],{"class":363,"line":378},[361,2583,1645],{"class":385},[361,2585,2586],{"class":363,"line":399},[361,2587,375],{"emptyLinePlaceholder":374},[361,2589,2590,2592,2594,2596,2598,2600],{"class":363,"line":416},[361,2591,2553],{"class":424},[361,2593,831],{"class":385},[361,2595,2577],{"class":402},[361,2597,2561],{"class":389},[361,2599,2564],{"class":381},[361,2601,2567],{"class":385},[361,2603,2604,2607,2610,2612,2615,2618,2620,2623],{"class":363,"line":440},[361,2605,2606],{"class":381},"  var",[361,2608,2609],{"class":518}," search",[361,2611,2561],{"class":389},[361,2613,2614],{"class":381}," new",[361,2616,2617],{"class":402}," DocumentSearch",[361,2619,1000],{"class":385},[361,2621,2622],{"class":518},"textEdit",[361,2624,1927],{"class":385},[361,2626,2627],{"class":363,"line":458},[361,2628,375],{"emptyLinePlaceholder":374},[361,2630,2631,2634,2636,2639,2641,2644,2646,2649],{"class":363,"line":464},[361,2632,2633],{"class":424},"  search",[361,2635,831],{"class":385},[361,2637,2638],{"class":424},"options",[361,2640,831],{"class":385},[361,2642,2643],{"class":518},"regExp",[361,2645,2561],{"class":389},[361,2647,2648],{"class":431}," true",[361,2650,2651],{"class":385},";\n",[361,2653,2654,2656,2658,2661,2663,2666,2669,2672,2674,2677],{"class":363,"line":477},[361,2655,2633],{"class":424},[361,2657,831],{"class":385},[361,2659,2660],{"class":518},"searchText",[361,2662,2561],{"class":389},[361,2664,2665],{"class":406}," \"key",[361,2667,2668],{"class":389},"\\\\",[361,2670,2671],{"class":406},"('url-param', '(.*)'",[361,2673,2668],{"class":389},[361,2675,2676],{"class":406},")\"",[361,2678,2651],{"class":385},[361,2680,2681,2683,2685,2688],{"class":363,"line":489},[361,2682,2633],{"class":424},[361,2684,831],{"class":385},[361,2686,2687],{"class":518},"replaceText",[361,2689,2690],{"class":389}," =\n",[361,2692,2693,2696,2698,2701],{"class":363,"line":504},[361,2694,2695],{"class":406},"    \"\u002Flayout_data\u002Fapplication_data\u002Ftemporaire\u002Fparam[@name='",[361,2697,2668],{"class":389},[361,2699,2700],{"class":406},"1']\"",[361,2702,2651],{"class":385},[361,2704,2705],{"class":363,"line":509},[361,2706,375],{"emptyLinePlaceholder":374},[361,2708,2709,2712,2714,2717,2719,2722],{"class":363,"line":515},[361,2710,2711],{"class":381},"  while",[361,2713,1318],{"class":385},[361,2715,2716],{"class":424},"search",[361,2718,831],{"class":385},[361,2720,2721],{"class":402},"next",[361,2723,2724],{"class":385},"()) {}\n",[361,2726,2727],{"class":363,"line":542},[361,2728,1645],{"class":385},[11,2730,2731,2732,2734,2735,2738],{},"La nouveauté se trouve dans l'ajout de quatre nouvelle méthodes. La\nméthode utilisé ici est ",[36,2733,2558],{}," et permet de faire des\nmodifications au texte avant sauvegarde. Tout comme ",[36,2736,2737],{},"afterSave"," permet\nd'effectuer des modifications au texte après sauvegarde. Nous avons\négalement deux méthodes beforeLoad et afterLoad pour les opérations à\nfaire lors de la lecture.",[21,2740,2742],{"id":2741},"autres-nouveautés","Autres nouveautés",[11,2744,2745],{},"Bien sur cet version apporte aussi d'autres nouveautés comme :",[26,2747,2748,2751],{},[29,2749,2750],{},"la fermeture automatique de balise",[29,2752,2753],{},"des nouvelles options, ...",[21,2755,2757],{"id":2756},"installation","Installation",[85,2759,2761],{"id":2760},"sous-mswindows","Sous Ms\u002FWindows",[11,2763,2764,2765,2767,2768,2773],{},"Pour installer la dernière version de ",[2269,2766,2430],{}," vous pouvez télécharger\nle ",[77,2769,2772],{"href":2770,"rel":2771},"http:\u002F\u002Fxinx.shadoware.org\u002Fdownloads\u002F40",[731],"programme d'installation"," et le lancer. Il remplacera\nautomatiquement l'ancienne version.",[11,2775,2776],{},"Si vous avez des fichiers de données modifiés (template, script, ...)\npensez à les sauvegarder.",[85,2778,2780],{"id":2779},"sous-gnulinux","Sous Gnu\u002FLinux",[11,2782,2783],{},"Sous Debian, vous pouvez ajouter le dépôt dans le fichier\n\u002Fetc\u002Fapt\u002Fsources.list. Ainsi vous serez automatiquement prévenu des\nmises à jours éventuelle.",[51,2785,2788],{"className":2786,"code":2787,"language":56},[54],"deb http:\u002F\u002Fapt.shadoware.org\u002F sid main\n",[36,2789,2787],{"__ignoreMap":59},[11,2791,2792],{},"puis dans une console :",[51,2794,2796],{"className":355,"code":2795,"language":357,"meta":59,"style":59},"sudo apt-cache search xinx\nsudo aptitude install xinx\n",[36,2797,2798,2811],{"__ignoreMap":59},[361,2799,2800,2803,2806,2808],{"class":363,"line":364},[361,2801,2802],{"class":402},"sudo",[361,2804,2805],{"class":406}," apt-cache",[361,2807,2609],{"class":406},[361,2809,2810],{"class":406}," xinx\n",[361,2812,2813,2815,2818,2821],{"class":363,"line":371},[361,2814,2802],{"class":402},[361,2816,2817],{"class":406}," aptitude",[361,2819,2820],{"class":406}," install",[361,2822,2810],{"class":406},[11,2824,2825,2826,2828],{},"Pour les autres distributions ou pour les machines MacOS vous pouvez\ncompiler ",[2269,2827,2430],{}," à partir des sources.",[762,2830,2831],{},"html pre.shiki code .sU0A5, html code.shiki .sU0A5{--shiki-default:#E5C07B}html pre.shiki code .sn6KH, html code.shiki .sn6KH{--shiki-default:#ABB2BF}html pre.shiki code .sVbv2, html code.shiki .sVbv2{--shiki-default:#61AFEF}html pre.shiki code .sjrmR, html code.shiki .sjrmR{--shiki-default:#56B6C2}html pre.shiki code .seHd6, html code.shiki .seHd6{--shiki-default:#C678DD}html pre.shiki code .sVyAn, html code.shiki .sVyAn{--shiki-default:#E06C75}html pre.shiki code .sVC51, html code.shiki .sVC51{--shiki-default:#D19A66}html pre.shiki code .subq3, html code.shiki .subq3{--shiki-default:#98C379}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":59,"searchDepth":371,"depth":371,"links":2833},[2834,2835,2836,2837,2838],{"id":2458,"depth":378,"text":2459},{"id":2511,"depth":378,"text":2512},{"id":2527,"depth":378,"text":2528},{"id":2741,"depth":378,"text":2742},{"id":2756,"depth":378,"text":2757},"xinx","2009-03-06",{"type":8,"value":2842},[2843,2847,2851],[11,2844,2845],{},[2180,2846],{"alt":2423,"src":2424},[11,2848,2427,2849,831],{},[2269,2850,2430],{},[11,2852,2853,2435,2855,831],{},[2269,2854,2430],{},[179,2856,2438],{},{},"\u002Fpost\u002Fxinx-0.8.0.0",{"title":2416,"description":59},"xinx-0.8.0.0","posts\u002FXINX\u002F2009-03-06-xinx-0.8.0.0",[794,2839,2863,2324,2864],"generix-group","xml","2LVP73RxAuNHiNwoDLW7n9zx61WC1hKRo8CPZUCY5rk",{"id":2867,"title":2868,"author":6,"body":2869,"category":775,"categorySlug":776,"date":5830,"description":5831,"excerpt":5832,"extension":786,"location":787,"meta":5852,"navigation":374,"path":5853,"published":374,"seo":5854,"slug":3178,"stem":5855,"tags":5856,"timeToRead":458,"__hash__":5857},"posts\u002Fposts\u002FSysAdmin\u002F2006-10-16-sauvegarde-automatique.md","Sauvegarde automatique 0.9",{"type":8,"value":2870,"toc":5825},[2871,2876,2883,2894,2897,2900,2904,3176,3180,4264,4268,5822],[11,2872,2873,2874,831],{},"Ce billet concerne une application, de mon cru, écrite en ",[36,2875,357],{},[11,2877,2878,2879,2882],{},"Elle utilise l'application ",[36,2880,2881],{},"dar"," pour effectuer des sauvegardes et les\ncopier sur un périphérique USB ou\u002Fet sur le réseau.Tous les patchs,\ncorrections, améliorations sont les bienvenues sur cette application\nmaison.",[11,2884,2885,2886,2889,2890,2893],{},"Pour fonctionner l'application se configure à l'aide d'un fichier du\ndossier ",[36,2887,2888],{},"\u002Fetc"," qui permet de déterminer une liste de dossier à\nsauvegarder (",[36,2891,2892],{},"\u002Fetc\u002Fautobackup","). Dans ce fichier, on y défini le dossier\nà sauvegarde, le dossier de destination, le nombre de sauvegarde\nincrémentale (ou dit d'une autre facon, au bout de combien fois faut-il\ncréer une nouvelle sauvegarde compléte?).",[11,2895,2896],{},"Il permet aussi de définir des points de copie où l'on place les\ndifférentes sauvegardes. (Ex: un périphérique USB, un dossier SSH).Ces\npoints sont, bien sûr, utilisés seulement s'ils existent. Le fichier est\ncopié sur le périphérique USB, s'il est branché, sur la machine distante\nsi elle est allumée, ....",[11,2898,2899],{},"Il ne reste plus qu'à configurer ces petits scripts et les mettre dans\nun cron",[21,2901,2903],{"id":2902},"contenu-exemple-du-fichier-de-configuration","Contenu exemple du fichier de configuration",[51,2905,2907],{"className":355,"code":2906,"language":357,"meta":59,"style":59},"# This config file make relation for backup\n\n# Options\nBACKUP_OPT=\"-v -s 4613734400 -D -z9 -m 150\"\nBACKUP_EXCLUDE_EXT=\"-Z *.avi -Z *.bz2 -Z *.gif -Z *.gz -Z *.jpg -Z *.mov -Z *.mpg -Z *.pbm -Z *.pdf -Z *.png -Z *.pnm -Z *.Z -Z *.zip\"\nBACKUP_EXCLUDE_PATH=\"-P phoenix\u002F.bogofilter -P phoenix\u002F.fonts -P phoenix\u002F.kde\u002Fcache-maxiding -P phoenix\u002F.kde\u002Fsocket-maxiding -P phoenix\u002F.kde\u002Ftmp-maxiding -P phoenix\u002F.spamassassin -P phoenix\u002F.thumbnails -P phoenix\u002F.turboprint -P phoenix\u002F.unison -P phoenix\u002F.wesnoth -P phoenix\u002F.widelands -P phoenix\u002F.wine* -P phoenix\u002Fusr -P phoenix\u002Fvirtuel -P .Trash-* -P phoenix\u002Ftmp\"\n\n# Copy Backup\nCOPYTO=\"usbdrive network\"\n\n# Copy to usb drive\nusbdrive_type=\"usb\"\nusbdrive_dev=\"\u002Fdev\u002Fusb\u002Fdisk1\"\nusbdrive_mountpoint=\"\u002Fmedia\u002Fdisque\u002F\"\nusbdrive_pathname=\"backup\u002F\"\n\n# Copy to network\nnetwork_type=\"net\"\nnetwork_host=\"miniding\"\nnetwork_user=\"phoenix\"\n# no network_pass : use ssh key for backup\nnetwork_dir=\"\u002Fhome\u002Fphoenix\u002Fbackup\"\n\n# Home\nhome_name=maxiding_home\nhome_source=\u002Fhome\u002F\nhome_destination=\u002Fgravure\u002Fdar\u002Fhome\u002F\nhome_inc_max=10\n\n# Etc\netc_name=maxiding_etc\netc_source=\u002Fetc\u002F\netc_destination=\u002Fgravure\u002Fdar\u002Fetc\u002F\netc_inc_max=10\n",[36,2908,2909,2914,2918,2923,2933,2943,2953,2957,2962,2972,2976,2981,2991,3001,3011,3021,3025,3030,3040,3050,3060,3065,3075,3079,3084,3094,3104,3114,3124,3128,3133,3144,3155,3166],{"__ignoreMap":59},[361,2910,2911],{"class":363,"line":364},[361,2912,2913],{"class":367},"# This config file make relation for backup\n",[361,2915,2916],{"class":363,"line":371},[361,2917,375],{"emptyLinePlaceholder":374},[361,2919,2920],{"class":363,"line":378},[361,2921,2922],{"class":367},"# Options\n",[361,2924,2925,2928,2930],{"class":363,"line":399},[361,2926,2927],{"class":518},"BACKUP_OPT",[361,2929,522],{"class":389},[361,2931,2932],{"class":406},"\"-v -s 4613734400 -D -z9 -m 150\"\n",[361,2934,2935,2938,2940],{"class":363,"line":416},[361,2936,2937],{"class":518},"BACKUP_EXCLUDE_EXT",[361,2939,522],{"class":389},[361,2941,2942],{"class":406},"\"-Z *.avi -Z *.bz2 -Z *.gif -Z *.gz -Z *.jpg -Z *.mov -Z *.mpg -Z *.pbm -Z *.pdf -Z *.png -Z *.pnm -Z *.Z -Z *.zip\"\n",[361,2944,2945,2948,2950],{"class":363,"line":440},[361,2946,2947],{"class":518},"BACKUP_EXCLUDE_PATH",[361,2949,522],{"class":389},[361,2951,2952],{"class":406},"\"-P phoenix\u002F.bogofilter -P phoenix\u002F.fonts -P phoenix\u002F.kde\u002Fcache-maxiding -P phoenix\u002F.kde\u002Fsocket-maxiding -P phoenix\u002F.kde\u002Ftmp-maxiding -P phoenix\u002F.spamassassin -P phoenix\u002F.thumbnails -P phoenix\u002F.turboprint -P phoenix\u002F.unison -P phoenix\u002F.wesnoth -P phoenix\u002F.widelands -P phoenix\u002F.wine* -P phoenix\u002Fusr -P phoenix\u002Fvirtuel -P .Trash-* -P phoenix\u002Ftmp\"\n",[361,2954,2955],{"class":363,"line":458},[361,2956,375],{"emptyLinePlaceholder":374},[361,2958,2959],{"class":363,"line":464},[361,2960,2961],{"class":367},"# Copy Backup\n",[361,2963,2964,2967,2969],{"class":363,"line":477},[361,2965,2966],{"class":518},"COPYTO",[361,2968,522],{"class":389},[361,2970,2971],{"class":406},"\"usbdrive network\"\n",[361,2973,2974],{"class":363,"line":489},[361,2975,375],{"emptyLinePlaceholder":374},[361,2977,2978],{"class":363,"line":504},[361,2979,2980],{"class":367},"# Copy to usb drive\n",[361,2982,2983,2986,2988],{"class":363,"line":509},[361,2984,2985],{"class":518},"usbdrive_type",[361,2987,522],{"class":389},[361,2989,2990],{"class":406},"\"usb\"\n",[361,2992,2993,2996,2998],{"class":363,"line":515},[361,2994,2995],{"class":518},"usbdrive_dev",[361,2997,522],{"class":389},[361,2999,3000],{"class":406},"\"\u002Fdev\u002Fusb\u002Fdisk1\"\n",[361,3002,3003,3006,3008],{"class":363,"line":542},[361,3004,3005],{"class":518},"usbdrive_mountpoint",[361,3007,522],{"class":389},[361,3009,3010],{"class":406},"\"\u002Fmedia\u002Fdisque\u002F\"\n",[361,3012,3013,3016,3018],{"class":363,"line":559},[361,3014,3015],{"class":518},"usbdrive_pathname",[361,3017,522],{"class":389},[361,3019,3020],{"class":406},"\"backup\u002F\"\n",[361,3022,3023],{"class":363,"line":570},[361,3024,375],{"emptyLinePlaceholder":374},[361,3026,3027],{"class":363,"line":575},[361,3028,3029],{"class":367},"# Copy to network\n",[361,3031,3032,3035,3037],{"class":363,"line":596},[361,3033,3034],{"class":518},"network_type",[361,3036,522],{"class":389},[361,3038,3039],{"class":406},"\"net\"\n",[361,3041,3042,3045,3047],{"class":363,"line":627},[361,3043,3044],{"class":518},"network_host",[361,3046,522],{"class":389},[361,3048,3049],{"class":406},"\"miniding\"\n",[361,3051,3052,3055,3057],{"class":363,"line":646},[361,3053,3054],{"class":518},"network_user",[361,3056,522],{"class":389},[361,3058,3059],{"class":406},"\"phoenix\"\n",[361,3061,3062],{"class":363,"line":658},[361,3063,3064],{"class":367},"# no network_pass : use ssh key for backup\n",[361,3066,3067,3070,3072],{"class":363,"line":677},[361,3068,3069],{"class":518},"network_dir",[361,3071,522],{"class":389},[361,3073,3074],{"class":406},"\"\u002Fhome\u002Fphoenix\u002Fbackup\"\n",[361,3076,3077],{"class":363,"line":691},[361,3078,375],{"emptyLinePlaceholder":374},[361,3080,3081],{"class":363,"line":700},[361,3082,3083],{"class":367},"# Home\n",[361,3085,3086,3089,3091],{"class":363,"line":705},[361,3087,3088],{"class":518},"home_name",[361,3090,522],{"class":389},[361,3092,3093],{"class":406},"maxiding_home\n",[361,3095,3096,3099,3101],{"class":363,"line":2064},[361,3097,3098],{"class":518},"home_source",[361,3100,522],{"class":389},[361,3102,3103],{"class":406},"\u002Fhome\u002F\n",[361,3105,3106,3109,3111],{"class":363,"line":2103},[361,3107,3108],{"class":518},"home_destination",[361,3110,522],{"class":389},[361,3112,3113],{"class":406},"\u002Fgravure\u002Fdar\u002Fhome\u002F\n",[361,3115,3116,3119,3121],{"class":363,"line":2134},[361,3117,3118],{"class":518},"home_inc_max",[361,3120,522],{"class":389},[361,3122,3123],{"class":406},"10\n",[361,3125,3126],{"class":363,"line":2141},[361,3127,375],{"emptyLinePlaceholder":374},[361,3129,3130],{"class":363,"line":2146},[361,3131,3132],{"class":367},"# Etc\n",[361,3134,3136,3139,3141],{"class":363,"line":3135},31,[361,3137,3138],{"class":518},"etc_name",[361,3140,522],{"class":389},[361,3142,3143],{"class":406},"maxiding_etc\n",[361,3145,3147,3150,3152],{"class":363,"line":3146},32,[361,3148,3149],{"class":518},"etc_source",[361,3151,522],{"class":389},[361,3153,3154],{"class":406},"\u002Fetc\u002F\n",[361,3156,3158,3161,3163],{"class":363,"line":3157},33,[361,3159,3160],{"class":518},"etc_destination",[361,3162,522],{"class":389},[361,3164,3165],{"class":406},"\u002Fgravure\u002Fdar\u002Fetc\u002F\n",[361,3167,3169,3172,3174],{"class":363,"line":3168},34,[361,3170,3171],{"class":518},"etc_inc_max",[361,3173,522],{"class":389},[361,3175,3123],{"class":406},[21,3177,3179],{"id":3178},"sauvegarde-automatique","Sauvegarde automatique",[51,3181,3183],{"className":355,"code":3182,"language":357,"meta":59,"style":59},"#!\u002Fbin\u002Fsh\n\n#############################################################################\n##   Copyright (C) 2006 by Ulrich Van Den Hekke                            ##\n##   ulrich.vdh@free.fr                                                    ##\n##                                                                         ##\n##   This program is free software; you can redistribute it and\u002For modify  ##\n##   it under the terms of the GNU General Public License as published by  ##\n##   the Free Software Foundation; either version 2 of the License, or     ##\n##   (at your option) any later version.                                   ##\n##                                                                         ##\n# \u002Fvar\n##   This program is distributed in the hope that it will be useful,       ##\n##   but WITHOUT ANY WARRANTY; without even the implied warranty of        ##\n##   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         ##\n##   GNU General Public License for more details.                          ##\n##                                                                         ##\n##   You should have received a copy of the GNU General Public License     ##\n##   along with this program; if not, write to the                         ##\n##   Free Software Foundation, Inc.,                                       ##\n##   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             ##\n#############################################################################\n\nif [ -e \u002Fetc\u002Fautobackup ] ; then\n        . \u002Fetc\u002Fautobackup\nelse\necho \"Please configure the autobackup config file\"\nexit 1\nfi\n\nif [ $# -ne 1 ] ; then\necho \"Please specify a project to backup\"\nexit 2\nfi\n\n# Define name of variable to use\nvar_name=\"\\$$1_name\"\nvar_source=\"\\$$1_source\"\nvar_destination=\"\\$$1_destination\"\nvar_inc_max=\"\\$$1_inc_max\"\n\n# Define content of variable for the project\nBACKUP_SRC=`eval echo $var_source`\nBACKUP_DST=`eval echo $var_destination`\nBACKUP_NAME=`eval echo $var_name`\nBACKUP_INCREMENTAL_MAX=`eval echo $var_inc_max`\n\nif [ -z \"$BACKUP_NAME\" ] ; then\necho \"Project undefined\"\nexit 3\nfi\n\nBACKUP_BIN=dar\nDATE_BACKUP=`date +%Y%m%d`\nBACKUP_ARCHIVE=\"${BACKUP_NAME}_${DATE_BACKUP}\"\n\n# From config file\n# COUNT_INCREMENTAL_BACKUP\n# LAST_BACKUP\n# LAST_COMPLETE_BACKUP\n\n# Some options\n# -v verbose\n# -c archive name\n# -R root place\n# -s slice size\n# -p slice pause\n# -D backup empty dir\n# -z9 compression gzip level 9\n# -m for minimal size\n# -Z exclude from compression\n# -P exclude file\n\nfunction start_backup() {\n        echo \"Backup of $BACKUP_SRC in progress ...\"\n\n        $BACKUP_BIN -c ${BACKUP_DST}${BACKUP_ARCHIVE} -R $BACKUP_SRC $BACKUP_OPT $BACKUP_EXCLUDE_EXT $BACKUP_EXCLUDE_PATH > ${BACKUP_DST}${BACKUP_NAME}.log\n}\n\nfunction load_backup_config() {\n        echo -n \"Load config file ... \"\n\n        if [ -e ${BACKUP_DST}${BACKUP_NAME}.config ] ; then\n                . ${BACKUP_DST}${BACKUP_NAME}.config\n                echo \"loaded.\"\n        else\n                COUNT_INCREMENTAL_BACKUP=$BACKUP_INCREMENTAL_MAX\n                echo \"not found\"\n        fi\n}\n\nfunction save_backup_config() {\n        echo \"Save backup config file ...\"\n\n        echo \"COUNT_INCREMENTAL_BACKUP=$COUNT_INCREMENTAL_BACKUP\" > ${BACKUP_DST}${BACKUP_NAME}.config\n        echo \"LAST_BACKUP=$DATE_BACKUP\"                          >> ${BACKUP_DST}${BACKUP_NAME}.config\n        echo \"LAST_COMPLETE_BACKUP=$LAST_COMPLETE_BACKUP\"        >> ${BACKUP_DST}${BACKUP_NAME}.config\n}\n\nfunction define_incremental() {\n        echo \"There is $COUNT_INCREMENTAL_BACKUP on $BACKUP_INCREMENTAL_MAX\"\n        if [ $COUNT_INCREMENTAL_BACKUP -lt $BACKUP_INCREMENTAL_MAX  ] ; then\n                echo \"Backup is incremental from $LAST_COMPLETE_BACKUP\"\n                COUNT_INCREMENTAL_BACKUP=`expr $COUNT_INCREMENTAL_BACKUP + 1`\n                BACKUP_OPT=\"-A ${BACKUP_DST}${BACKUP_NAME}_${LAST_COMPLETE_BACKUP} ${BACKUP_OPT}\"\n        else\n                echo \"Backup is complete\"\n                COUNT_INCREMENTAL_BACKUP=1\n                LAST_COMPLETE_BACKUP=$DATE_BACKUP\n        fi\n}\n\nload_backup_config;\ndefine_incremental;\nstart_backup;\nsave_backup_config;\n",[36,3184,3185,3189,3193,3198,3203,3208,3213,3218,3223,3228,3233,3237,3242,3247,3252,3257,3262,3266,3271,3276,3281,3286,3290,3294,3307,3315,3320,3328,3336,3340,3344,3361,3368,3375,3379,3384,3390,3409,3426,3443,3460,3465,3471,3493,3512,3531,3550,3555,3575,3583,3591,3596,3601,3612,3628,3649,3654,3660,3666,3672,3678,3683,3689,3695,3701,3707,3713,3719,3725,3731,3737,3743,3749,3754,3765,3779,3784,3836,3841,3846,3856,3867,3872,3894,3913,3922,3928,3939,3947,3952,3957,3962,3972,3980,3985,4010,4036,4062,4067,4072,4082,4100,4120,4132,4154,4183,4188,4196,4206,4217,4222,4227,4232,4240,4248,4256],{"__ignoreMap":59},[361,3186,3187],{"class":363,"line":364},[361,3188,368],{"class":367},[361,3190,3191],{"class":363,"line":371},[361,3192,375],{"emptyLinePlaceholder":374},[361,3194,3195],{"class":363,"line":378},[361,3196,3197],{"class":367},"#############################################################################\n",[361,3199,3200],{"class":363,"line":399},[361,3201,3202],{"class":367},"##   Copyright (C) 2006 by Ulrich Van Den Hekke                            ##\n",[361,3204,3205],{"class":363,"line":416},[361,3206,3207],{"class":367},"##   ulrich.vdh@free.fr                                                    ##\n",[361,3209,3210],{"class":363,"line":440},[361,3211,3212],{"class":367},"##                                                                         ##\n",[361,3214,3215],{"class":363,"line":458},[361,3216,3217],{"class":367},"##   This program is free software; you can redistribute it and\u002For modify  ##\n",[361,3219,3220],{"class":363,"line":464},[361,3221,3222],{"class":367},"##   it under the terms of the GNU General Public License as published by  ##\n",[361,3224,3225],{"class":363,"line":477},[361,3226,3227],{"class":367},"##   the Free Software Foundation; either version 2 of the License, or     ##\n",[361,3229,3230],{"class":363,"line":489},[361,3231,3232],{"class":367},"##   (at your option) any later version.                                   ##\n",[361,3234,3235],{"class":363,"line":504},[361,3236,3212],{"class":367},[361,3238,3239],{"class":363,"line":509},[361,3240,3241],{"class":367},"# \u002Fvar\n",[361,3243,3244],{"class":363,"line":515},[361,3245,3246],{"class":367},"##   This program is distributed in the hope that it will be useful,       ##\n",[361,3248,3249],{"class":363,"line":542},[361,3250,3251],{"class":367},"##   but WITHOUT ANY WARRANTY; without even the implied warranty of        ##\n",[361,3253,3254],{"class":363,"line":559},[361,3255,3256],{"class":367},"##   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         ##\n",[361,3258,3259],{"class":363,"line":570},[361,3260,3261],{"class":367},"##   GNU General Public License for more details.                          ##\n",[361,3263,3264],{"class":363,"line":575},[361,3265,3212],{"class":367},[361,3267,3268],{"class":363,"line":596},[361,3269,3270],{"class":367},"##   You should have received a copy of the GNU General Public License     ##\n",[361,3272,3273],{"class":363,"line":627},[361,3274,3275],{"class":367},"##   along with this program; if not, write to the                         ##\n",[361,3277,3278],{"class":363,"line":646},[361,3279,3280],{"class":367},"##   Free Software Foundation, Inc.,                                       ##\n",[361,3282,3283],{"class":363,"line":658},[361,3284,3285],{"class":367},"##   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             ##\n",[361,3287,3288],{"class":363,"line":677},[361,3289,3197],{"class":367},[361,3291,3292],{"class":363,"line":691},[361,3293,375],{"emptyLinePlaceholder":374},[361,3295,3296,3298,3300,3302,3305],{"class":363,"line":700},[361,3297,382],{"class":381},[361,3299,386],{"class":385},[361,3301,390],{"class":389},[361,3303,3304],{"class":385}," \u002Fetc\u002Fautobackup ] ; ",[361,3306,396],{"class":381},[361,3308,3309,3312],{"class":363,"line":705},[361,3310,3311],{"class":389},"        .",[361,3313,3314],{"class":406}," \u002Fetc\u002Fautobackup\n",[361,3316,3317],{"class":363,"line":2064},[361,3318,3319],{"class":381},"else\n",[361,3321,3322,3325],{"class":363,"line":2103},[361,3323,3324],{"class":389},"echo",[361,3326,3327],{"class":406}," \"Please configure the autobackup config file\"\n",[361,3329,3330,3333],{"class":363,"line":2134},[361,3331,3332],{"class":389},"exit",[361,3334,3335],{"class":431}," 1\n",[361,3337,3338],{"class":363,"line":2141},[361,3339,708],{"class":381},[361,3341,3342],{"class":363,"line":2146},[361,3343,375],{"emptyLinePlaceholder":374},[361,3345,3346,3348,3350,3353,3355,3357,3359],{"class":363,"line":3135},[361,3347,382],{"class":381},[361,3349,386],{"class":385},[361,3351,3352],{"class":424},"$#",[361,3354,667],{"class":389},[361,3356,1249],{"class":431},[361,3358,435],{"class":385},[361,3360,396],{"class":381},[361,3362,3363,3365],{"class":363,"line":3146},[361,3364,3324],{"class":389},[361,3366,3367],{"class":406}," \"Please specify a project to backup\"\n",[361,3369,3370,3372],{"class":363,"line":3157},[361,3371,3332],{"class":389},[361,3373,3374],{"class":431}," 2\n",[361,3376,3377],{"class":363,"line":3168},[361,3378,708],{"class":381},[361,3380,3382],{"class":363,"line":3381},35,[361,3383,375],{"emptyLinePlaceholder":374},[361,3385,3387],{"class":363,"line":3386},36,[361,3388,3389],{"class":367},"# Define name of variable to use\n",[361,3391,3393,3396,3398,3400,3403,3406],{"class":363,"line":3392},37,[361,3394,3395],{"class":518},"var_name",[361,3397,522],{"class":389},[361,3399,587],{"class":406},[361,3401,3402],{"class":389},"\\$",[361,3404,3405],{"class":518},"$1_name",[361,3407,3408],{"class":406},"\"\n",[361,3410,3412,3415,3417,3419,3421,3424],{"class":363,"line":3411},38,[361,3413,3414],{"class":518},"var_source",[361,3416,522],{"class":389},[361,3418,587],{"class":406},[361,3420,3402],{"class":389},[361,3422,3423],{"class":518},"$1_source",[361,3425,3408],{"class":406},[361,3427,3429,3432,3434,3436,3438,3441],{"class":363,"line":3428},39,[361,3430,3431],{"class":518},"var_destination",[361,3433,522],{"class":389},[361,3435,587],{"class":406},[361,3437,3402],{"class":389},[361,3439,3440],{"class":518},"$1_destination",[361,3442,3408],{"class":406},[361,3444,3446,3449,3451,3453,3455,3458],{"class":363,"line":3445},40,[361,3447,3448],{"class":518},"var_inc_max",[361,3450,522],{"class":389},[361,3452,587],{"class":406},[361,3454,3402],{"class":389},[361,3456,3457],{"class":518},"$1_inc_max",[361,3459,3408],{"class":406},[361,3461,3463],{"class":363,"line":3462},41,[361,3464,375],{"emptyLinePlaceholder":374},[361,3466,3468],{"class":363,"line":3467},42,[361,3469,3470],{"class":367},"# Define content of variable for the project\n",[361,3472,3474,3477,3479,3481,3484,3487,3490],{"class":363,"line":3473},43,[361,3475,3476],{"class":518},"BACKUP_SRC",[361,3478,522],{"class":389},[361,3480,525],{"class":406},[361,3482,3483],{"class":389},"eval",[361,3485,3486],{"class":406}," echo ",[361,3488,3489],{"class":518},"$var_source",[361,3491,3492],{"class":406},"`\n",[361,3494,3496,3499,3501,3503,3505,3507,3510],{"class":363,"line":3495},44,[361,3497,3498],{"class":518},"BACKUP_DST",[361,3500,522],{"class":389},[361,3502,525],{"class":406},[361,3504,3483],{"class":389},[361,3506,3486],{"class":406},[361,3508,3509],{"class":518},"$var_destination",[361,3511,3492],{"class":406},[361,3513,3515,3518,3520,3522,3524,3526,3529],{"class":363,"line":3514},45,[361,3516,3517],{"class":518},"BACKUP_NAME",[361,3519,522],{"class":389},[361,3521,525],{"class":406},[361,3523,3483],{"class":389},[361,3525,3486],{"class":406},[361,3527,3528],{"class":518},"$var_name",[361,3530,3492],{"class":406},[361,3532,3534,3537,3539,3541,3543,3545,3548],{"class":363,"line":3533},46,[361,3535,3536],{"class":518},"BACKUP_INCREMENTAL_MAX",[361,3538,522],{"class":389},[361,3540,525],{"class":406},[361,3542,3483],{"class":389},[361,3544,3486],{"class":406},[361,3546,3547],{"class":518},"$var_inc_max",[361,3549,3492],{"class":406},[361,3551,3553],{"class":363,"line":3552},47,[361,3554,375],{"emptyLinePlaceholder":374},[361,3556,3558,3560,3562,3564,3566,3569,3571,3573],{"class":363,"line":3557},48,[361,3559,382],{"class":381},[361,3561,386],{"class":385},[361,3563,549],{"class":389},[361,3565,581],{"class":406},[361,3567,3568],{"class":518},"$BACKUP_NAME",[361,3570,587],{"class":406},[361,3572,435],{"class":385},[361,3574,396],{"class":381},[361,3576,3578,3580],{"class":363,"line":3577},49,[361,3579,3324],{"class":389},[361,3581,3582],{"class":406}," \"Project undefined\"\n",[361,3584,3586,3588],{"class":363,"line":3585},50,[361,3587,3332],{"class":389},[361,3589,3590],{"class":431}," 3\n",[361,3592,3594],{"class":363,"line":3593},51,[361,3595,708],{"class":381},[361,3597,3599],{"class":363,"line":3598},52,[361,3600,375],{"emptyLinePlaceholder":374},[361,3602,3604,3607,3609],{"class":363,"line":3603},53,[361,3605,3606],{"class":518},"BACKUP_BIN",[361,3608,522],{"class":389},[361,3610,3611],{"class":406},"dar\n",[361,3613,3615,3618,3620,3622,3625],{"class":363,"line":3614},54,[361,3616,3617],{"class":518},"DATE_BACKUP",[361,3619,522],{"class":389},[361,3621,525],{"class":406},[361,3623,3624],{"class":402},"date",[361,3626,3627],{"class":406}," +%Y%m%d`\n",[361,3629,3631,3634,3636,3639,3641,3644,3646],{"class":363,"line":3630},55,[361,3632,3633],{"class":518},"BACKUP_ARCHIVE",[361,3635,522],{"class":389},[361,3637,3638],{"class":406},"\"${",[361,3640,3517],{"class":518},[361,3642,3643],{"class":406},"}_${",[361,3645,3617],{"class":518},[361,3647,3648],{"class":406},"}\"\n",[361,3650,3652],{"class":363,"line":3651},56,[361,3653,375],{"emptyLinePlaceholder":374},[361,3655,3657],{"class":363,"line":3656},57,[361,3658,3659],{"class":367},"# From config file\n",[361,3661,3663],{"class":363,"line":3662},58,[361,3664,3665],{"class":367},"# COUNT_INCREMENTAL_BACKUP\n",[361,3667,3669],{"class":363,"line":3668},59,[361,3670,3671],{"class":367},"# LAST_BACKUP\n",[361,3673,3675],{"class":363,"line":3674},60,[361,3676,3677],{"class":367},"# LAST_COMPLETE_BACKUP\n",[361,3679,3681],{"class":363,"line":3680},61,[361,3682,375],{"emptyLinePlaceholder":374},[361,3684,3686],{"class":363,"line":3685},62,[361,3687,3688],{"class":367},"# Some options\n",[361,3690,3692],{"class":363,"line":3691},63,[361,3693,3694],{"class":367},"# -v verbose\n",[361,3696,3698],{"class":363,"line":3697},64,[361,3699,3700],{"class":367},"# -c archive name\n",[361,3702,3704],{"class":363,"line":3703},65,[361,3705,3706],{"class":367},"# -R root place\n",[361,3708,3710],{"class":363,"line":3709},66,[361,3711,3712],{"class":367},"# -s slice size\n",[361,3714,3716],{"class":363,"line":3715},67,[361,3717,3718],{"class":367},"# -p slice pause\n",[361,3720,3722],{"class":363,"line":3721},68,[361,3723,3724],{"class":367},"# -D backup empty dir\n",[361,3726,3728],{"class":363,"line":3727},69,[361,3729,3730],{"class":367},"# -z9 compression gzip level 9\n",[361,3732,3734],{"class":363,"line":3733},70,[361,3735,3736],{"class":367},"# -m for minimal size\n",[361,3738,3740],{"class":363,"line":3739},71,[361,3741,3742],{"class":367},"# -Z exclude from compression\n",[361,3744,3746],{"class":363,"line":3745},72,[361,3747,3748],{"class":367},"# -P exclude file\n",[361,3750,3752],{"class":363,"line":3751},73,[361,3753,375],{"emptyLinePlaceholder":374},[361,3755,3757,3760,3763],{"class":363,"line":3756},74,[361,3758,3759],{"class":381},"function",[361,3761,3762],{"class":402}," start_backup",[361,3764,2567],{"class":385},[361,3766,3768,3770,3773,3776],{"class":363,"line":3767},75,[361,3769,578],{"class":389},[361,3771,3772],{"class":406}," \"Backup of ",[361,3774,3775],{"class":518},"$BACKUP_SRC",[361,3777,3778],{"class":406}," in progress ...\"\n",[361,3780,3782],{"class":363,"line":3781},76,[361,3783,375],{"emptyLinePlaceholder":374},[361,3785,3787,3790,3793,3796,3798,3801,3803,3806,3809,3812,3815,3818,3821,3824,3826,3828,3830,3833],{"class":363,"line":3786},77,[361,3788,3789],{"class":518},"        $BACKUP_BIN",[361,3791,3792],{"class":431}," -c",[361,3794,3795],{"class":385}," ${",[361,3797,3498],{"class":518},[361,3799,3800],{"class":385},"}${",[361,3802,3633],{"class":518},[361,3804,3805],{"class":385},"} ",[361,3807,3808],{"class":431},"-R",[361,3810,3811],{"class":518}," $BACKUP_SRC",[361,3813,3814],{"class":518}," $BACKUP_OPT",[361,3816,3817],{"class":518}," $BACKUP_EXCLUDE_EXT",[361,3819,3820],{"class":518}," $BACKUP_EXCLUDE_PATH",[361,3822,3823],{"class":385}," > ${",[361,3825,3498],{"class":518},[361,3827,3800],{"class":385},[361,3829,3517],{"class":518},[361,3831,3832],{"class":385},"}",[361,3834,3835],{"class":406},".log\n",[361,3837,3839],{"class":363,"line":3838},78,[361,3840,2149],{"class":385},[361,3842,3844],{"class":363,"line":3843},79,[361,3845,375],{"emptyLinePlaceholder":374},[361,3847,3849,3851,3854],{"class":363,"line":3848},80,[361,3850,3759],{"class":381},[361,3852,3853],{"class":402}," load_backup_config",[361,3855,2567],{"class":385},[361,3857,3859,3861,3864],{"class":363,"line":3858},81,[361,3860,578],{"class":389},[361,3862,3863],{"class":431}," -n",[361,3865,3866],{"class":406}," \"Load config file ... \"\n",[361,3868,3870],{"class":363,"line":3869},82,[361,3871,375],{"emptyLinePlaceholder":374},[361,3873,3875,3877,3879,3881,3883,3885,3887,3889,3892],{"class":363,"line":3874},83,[361,3876,419],{"class":381},[361,3878,386],{"class":385},[361,3880,390],{"class":389},[361,3882,3795],{"class":385},[361,3884,3498],{"class":518},[361,3886,3800],{"class":385},[361,3888,3517],{"class":518},[361,3890,3891],{"class":385},"}.config ] ; ",[361,3893,396],{"class":381},[361,3895,3897,3900,3902,3904,3906,3908,3910],{"class":363,"line":3896},84,[361,3898,3899],{"class":389},"                .",[361,3901,3795],{"class":385},[361,3903,3498],{"class":518},[361,3905,3800],{"class":385},[361,3907,3517],{"class":518},[361,3909,3832],{"class":385},[361,3911,3912],{"class":406},".config\n",[361,3914,3916,3919],{"class":363,"line":3915},85,[361,3917,3918],{"class":389},"                echo",[361,3920,3921],{"class":406}," \"loaded.\"\n",[361,3923,3925],{"class":363,"line":3924},86,[361,3926,3927],{"class":381},"        else\n",[361,3929,3931,3934,3936],{"class":363,"line":3930},87,[361,3932,3933],{"class":518},"                COUNT_INCREMENTAL_BACKUP",[361,3935,522],{"class":389},[361,3937,3938],{"class":518},"$BACKUP_INCREMENTAL_MAX\n",[361,3940,3942,3944],{"class":363,"line":3941},88,[361,3943,3918],{"class":389},[361,3945,3946],{"class":406}," \"not found\"\n",[361,3948,3950],{"class":363,"line":3949},89,[361,3951,461],{"class":381},[361,3953,3955],{"class":363,"line":3954},90,[361,3956,2149],{"class":385},[361,3958,3960],{"class":363,"line":3959},91,[361,3961,375],{"emptyLinePlaceholder":374},[361,3963,3965,3967,3970],{"class":363,"line":3964},92,[361,3966,3759],{"class":381},[361,3968,3969],{"class":402}," save_backup_config",[361,3971,2567],{"class":385},[361,3973,3975,3977],{"class":363,"line":3974},93,[361,3976,578],{"class":389},[361,3978,3979],{"class":406}," \"Save backup config file ...\"\n",[361,3981,3983],{"class":363,"line":3982},94,[361,3984,375],{"emptyLinePlaceholder":374},[361,3986,3988,3990,3993,3996,3998,4000,4002,4004,4006,4008],{"class":363,"line":3987},95,[361,3989,578],{"class":389},[361,3991,3992],{"class":406}," \"COUNT_INCREMENTAL_BACKUP=",[361,3994,3995],{"class":518},"$COUNT_INCREMENTAL_BACKUP",[361,3997,587],{"class":406},[361,3999,3823],{"class":385},[361,4001,3498],{"class":518},[361,4003,3800],{"class":385},[361,4005,3517],{"class":518},[361,4007,3832],{"class":385},[361,4009,3912],{"class":406},[361,4011,4013,4015,4018,4021,4023,4026,4028,4030,4032,4034],{"class":363,"line":4012},96,[361,4014,578],{"class":389},[361,4016,4017],{"class":406}," \"LAST_BACKUP=",[361,4019,4020],{"class":518},"$DATE_BACKUP",[361,4022,587],{"class":406},[361,4024,4025],{"class":385},"                          >> ${",[361,4027,3498],{"class":518},[361,4029,3800],{"class":385},[361,4031,3517],{"class":518},[361,4033,3832],{"class":385},[361,4035,3912],{"class":406},[361,4037,4039,4041,4044,4047,4049,4052,4054,4056,4058,4060],{"class":363,"line":4038},97,[361,4040,578],{"class":389},[361,4042,4043],{"class":406}," \"LAST_COMPLETE_BACKUP=",[361,4045,4046],{"class":518},"$LAST_COMPLETE_BACKUP",[361,4048,587],{"class":406},[361,4050,4051],{"class":385},"        >> ${",[361,4053,3498],{"class":518},[361,4055,3800],{"class":385},[361,4057,3517],{"class":518},[361,4059,3832],{"class":385},[361,4061,3912],{"class":406},[361,4063,4065],{"class":363,"line":4064},98,[361,4066,2149],{"class":385},[361,4068,4070],{"class":363,"line":4069},99,[361,4071,375],{"emptyLinePlaceholder":374},[361,4073,4075,4077,4080],{"class":363,"line":4074},100,[361,4076,3759],{"class":381},[361,4078,4079],{"class":402}," define_incremental",[361,4081,2567],{"class":385},[361,4083,4085,4087,4090,4092,4095,4098],{"class":363,"line":4084},101,[361,4086,578],{"class":389},[361,4088,4089],{"class":406}," \"There is ",[361,4091,3995],{"class":518},[361,4093,4094],{"class":406}," on ",[361,4096,4097],{"class":518},"$BACKUP_INCREMENTAL_MAX",[361,4099,3408],{"class":406},[361,4101,4103,4105,4107,4109,4112,4115,4118],{"class":363,"line":4102},102,[361,4104,419],{"class":381},[361,4106,386],{"class":385},[361,4108,3995],{"class":518},[361,4110,4111],{"class":389}," -lt",[361,4113,4114],{"class":518}," $BACKUP_INCREMENTAL_MAX",[361,4116,4117],{"class":385},"  ] ; ",[361,4119,396],{"class":381},[361,4121,4123,4125,4128,4130],{"class":363,"line":4122},103,[361,4124,3918],{"class":389},[361,4126,4127],{"class":406}," \"Backup is incremental from ",[361,4129,4046],{"class":518},[361,4131,3408],{"class":406},[361,4133,4135,4137,4139,4141,4144,4147,4150,4152],{"class":363,"line":4134},104,[361,4136,3933],{"class":518},[361,4138,522],{"class":389},[361,4140,525],{"class":406},[361,4142,4143],{"class":402},"expr",[361,4145,4146],{"class":518}," $COUNT_INCREMENTAL_BACKUP",[361,4148,4149],{"class":406}," + ",[361,4151,83],{"class":431},[361,4153,3492],{"class":406},[361,4155,4157,4160,4162,4165,4167,4169,4171,4173,4176,4179,4181],{"class":363,"line":4156},105,[361,4158,4159],{"class":518},"                BACKUP_OPT",[361,4161,522],{"class":389},[361,4163,4164],{"class":406},"\"-A ${",[361,4166,3498],{"class":518},[361,4168,3800],{"class":406},[361,4170,3517],{"class":518},[361,4172,3643],{"class":406},[361,4174,4175],{"class":518},"LAST_COMPLETE_BACKUP",[361,4177,4178],{"class":406},"} ${",[361,4180,2927],{"class":518},[361,4182,3648],{"class":406},[361,4184,4186],{"class":363,"line":4185},106,[361,4187,3927],{"class":381},[361,4189,4191,4193],{"class":363,"line":4190},107,[361,4192,3918],{"class":389},[361,4194,4195],{"class":406}," \"Backup is complete\"\n",[361,4197,4199,4201,4203],{"class":363,"line":4198},108,[361,4200,3933],{"class":518},[361,4202,522],{"class":389},[361,4204,4205],{"class":406},"1\n",[361,4207,4209,4212,4214],{"class":363,"line":4208},109,[361,4210,4211],{"class":518},"                LAST_COMPLETE_BACKUP",[361,4213,522],{"class":389},[361,4215,4216],{"class":518},"$DATE_BACKUP\n",[361,4218,4220],{"class":363,"line":4219},110,[361,4221,461],{"class":381},[361,4223,4225],{"class":363,"line":4224},111,[361,4226,2149],{"class":385},[361,4228,4230],{"class":363,"line":4229},112,[361,4231,375],{"emptyLinePlaceholder":374},[361,4233,4235,4238],{"class":363,"line":4234},113,[361,4236,4237],{"class":402},"load_backup_config",[361,4239,2651],{"class":385},[361,4241,4243,4246],{"class":363,"line":4242},114,[361,4244,4245],{"class":402},"define_incremental",[361,4247,2651],{"class":385},[361,4249,4251,4254],{"class":363,"line":4250},115,[361,4252,4253],{"class":402},"start_backup",[361,4255,2651],{"class":385},[361,4257,4259,4262],{"class":363,"line":4258},116,[361,4260,4261],{"class":402},"save_backup_config",[361,4263,2651],{"class":385},[21,4265,4267],{"id":4266},"copie-automatique","Copie automatique",[51,4269,4271],{"className":355,"code":4270,"language":357,"meta":59,"style":59},"#!\u002Fbin\u002Fsh\n\n#############################################################################\n##   Copyright (C) 2006 by Ulrich Van Den Hekke                            ##\n##   ulrich.vdh@free.fr                                                    ##\n##                                                                         ##\n##   This program is free software; you can redistribute it and\u002For modify  ##\n##   it under the terms of the GNU General Public License as published by  ##\n##   the Free Software Foundation; either version 2 of the License, or     ##\n##   (at your option) any later version.                                   ##\n##                                                                         ##\n##   This program is distributed in the hope that it will be useful,       ##\n##   but WITHOUT ANY WARRANTY; without even the implied warranty of        ##\n##   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         ##\n##   GNU General Public License for more details.                          ##\n##                                                                         ##\n##   You should have received a copy of the GNU General Public License     ##\n##   along with this program; if not, write to the                         ##\n##   Free Software Foundation, Inc.,                                       ##\n##   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             ##\n#############################################################################\n\nif [ -e \u002Fetc\u002Fautobackup ] ; then\n        . \u002Fetc\u002Fautobackup\nelse\necho \"Please configure the autobackup config file\"\nexit 1\nfi\n\nif [ $# -ne 1 ] ; then\necho \"Please specify a project to backup\"\nexit 2\nfi\n\n# Define name of variable to use\nvar_name=\"\\$$1_name\"\nvar_source=\"\\$$1_source\"\nvar_destination=\"\\$$1_destination\"\nvar_inc_max=\"\\$$1_inc_max\"\n\n# Define content of variable for the project\nBACKUP_SRC=`eval echo $var_source`\nBACKUP_DST=`eval echo $var_destination`\nBACKUP_NAME=`eval echo $var_name`\nBACKUP_INCREMENTAL_MAX=`eval echo $var_inc_max`\n\nif [ -z \"$BACKUP_NAME\" ] ; then\necho \"Project undefined\"\nexit 3\nfi\n\n# From config file\n# COUNT_INCREMENTAL_BACKUP\n# LAST_BACKUP\n# LAST_COMPLETE_BACKUP\n\nfunction load_backup_config() {\n        echo -n \"Load config file ... \"\n\n        if [ -e ${BACKUP_DST}${BACKUP_NAME}.config ] ; then\n                . ${BACKUP_DST}${BACKUP_NAME}.config\n\n                BACKUP_ARCHIVE=\"${BACKUP_NAME}_${LAST_BACKUP}\"\n                echo \"loaded.\"\n        else\n                echo \"not found\"\n                exit 4\n        fi\n}\n\nfunction save_by_network() {\n        echo -n \"Save on computer $HOST as $USER on $DIR\"\n\n        ping -c 3 -W 10 $HOST > \u002Fdev\u002Fnull\n\n        if [ $? -ne 0 ] ; then\n                echo \"failed\"\n        else\n                DESTINATION=\"${HOST}:${DIR}\"\n                if [ -n $USER ] ; then\n                        DESTINATION=\"${USER}@${DESTINATION}\"\n                fi\n                scp ${BACKUP_DST}${BACKUP_ARCHIVE}* $DESTINATION\n\n                if [ $? -ne 0 ] ; then\n                        echo \"failed\"\n                else\n                        echo \"ok\"\n                fi\n        fi\n}\n\nfunction save_by_usb() {\n        echo -n \"Save on drive $DEV \"\n\n        if [ -e $DEV ] ; then\n                TOUMOUNT=1\n                LINECOUNT=`mount | grep $DEV | cut -f 1 -d\\  | wc -l `\n                if [ $LINECOUNT -gt 0 ] ; then\n                        MOUNTPOINT=`mount | grep $DEV | cut -f 3 -d\\ `\n                        TOUMOUNT=0\n                else\n                        mount $MOUNTPOINT\n\n                        if [ $? -ne 0 ] ; then\n                                echo \"mount failed \"\n                        fi\n                fi\n                if [ -d ${MOUNTPOINT}${PATHNAME} ] ; then\n                        for FILE in `ls -1 ${BACKUP_DST}${BACKUP_ARCHIVE}*` ; do\n                                FILENAME=`basename $FILE`\n                                if [ -e ${MOUNTPOINT}${PATHNAME}${FILENAME} ] ; then\n                                        echo \"exist \"\n                                else\n                                        cp ${FILE} ${MOUNTPOINT}${PATHNAME}\n                                fi\n                        done\n\n                        echo \"ok\"\n                else\n                        echo \"failed\"\n                fi\n                if [ $TOUMOUNT -eq 1 ] ; then\n                        umount $MOUNTPOINT\n                fi\n\n        else\n                echo \"device not found\"\n        fi\n}\n\nfunction copy_to() {\n        echo \"Start make copy of backup $BACKUP_NAME\"\n\n        for NAME in $COPYTO ; do\n                var_type=\"\\$${NAME}_type\"\n                TYPE=`eval echo $var_type`\n\n                echo \"--> $NAME as $TYPE\"\n                case $TYPE in\n                        \"usb\")\n                                var_dev=\"\\$${NAME}_dev\"\n                                DEV=`eval echo $var_dev`\n\n                                var_mountpoint=\"\\$${NAME}_mountpoint\"\n                                MOUNTPOINT=`eval echo $var_mountpoint`\n\n                                var_pathname=\"\\$${NAME}_pathname\"\n                                PATHNAME=`eval echo $var_pathname`\n\n                                save_by_usb;\n                        ;;\n\n                        \"net\")\n                                var_host=\"\\$${NAME}_host\"\n                                HOST=`eval echo $var_host`\n\n                                var_user=\"\\$${NAME}_user\"\n                                USER=`eval echo $var_user`\n\n                                var_dir=\"\\$${NAME}_dir\"\n                                DIR=`eval echo $var_dir`\n\n                                save_by_network;\n                        ;;\n                esac\n        done\n}\n\ncopy_to;\n",[36,4272,4273,4277,4281,4285,4289,4293,4297,4301,4305,4309,4313,4317,4321,4325,4329,4333,4337,4341,4345,4349,4353,4357,4361,4373,4379,4383,4389,4395,4399,4403,4419,4425,4431,4435,4439,4443,4457,4471,4485,4499,4503,4507,4523,4539,4555,4571,4575,4593,4599,4605,4609,4613,4617,4621,4625,4629,4633,4641,4649,4653,4673,4689,4693,4711,4717,4721,4727,4735,4739,4743,4747,4756,4781,4785,4809,4813,4829,4836,4840,4860,4877,4897,4902,4922,4926,4942,4949,4954,4961,4965,4969,4973,4977,4986,5001,5005,5020,5029,5075,5093,5124,5134,5138,5146,5150,5167,5175,5180,5184,5208,5248,5265,5291,5299,5304,5324,5329,5335,5340,5347,5352,5359,5364,5383,5391,5396,5401,5406,5414,5419,5424,5429,5439,5451,5456,5474,5495,5514,5519,5537,5549,5558,5577,5588,5593,5608,5619,5624,5639,5650,5655,5663,5669,5674,5682,5701,5712,5717,5732,5743,5748,5763,5774,5779,5787,5792,5798,5804,5809,5814],{"__ignoreMap":59},[361,4274,4275],{"class":363,"line":364},[361,4276,368],{"class":367},[361,4278,4279],{"class":363,"line":371},[361,4280,375],{"emptyLinePlaceholder":374},[361,4282,4283],{"class":363,"line":378},[361,4284,3197],{"class":367},[361,4286,4287],{"class":363,"line":399},[361,4288,3202],{"class":367},[361,4290,4291],{"class":363,"line":416},[361,4292,3207],{"class":367},[361,4294,4295],{"class":363,"line":440},[361,4296,3212],{"class":367},[361,4298,4299],{"class":363,"line":458},[361,4300,3217],{"class":367},[361,4302,4303],{"class":363,"line":464},[361,4304,3222],{"class":367},[361,4306,4307],{"class":363,"line":477},[361,4308,3227],{"class":367},[361,4310,4311],{"class":363,"line":489},[361,4312,3232],{"class":367},[361,4314,4315],{"class":363,"line":504},[361,4316,3212],{"class":367},[361,4318,4319],{"class":363,"line":509},[361,4320,3246],{"class":367},[361,4322,4323],{"class":363,"line":515},[361,4324,3251],{"class":367},[361,4326,4327],{"class":363,"line":542},[361,4328,3256],{"class":367},[361,4330,4331],{"class":363,"line":559},[361,4332,3261],{"class":367},[361,4334,4335],{"class":363,"line":570},[361,4336,3212],{"class":367},[361,4338,4339],{"class":363,"line":575},[361,4340,3270],{"class":367},[361,4342,4343],{"class":363,"line":596},[361,4344,3275],{"class":367},[361,4346,4347],{"class":363,"line":627},[361,4348,3280],{"class":367},[361,4350,4351],{"class":363,"line":646},[361,4352,3285],{"class":367},[361,4354,4355],{"class":363,"line":658},[361,4356,3197],{"class":367},[361,4358,4359],{"class":363,"line":677},[361,4360,375],{"emptyLinePlaceholder":374},[361,4362,4363,4365,4367,4369,4371],{"class":363,"line":691},[361,4364,382],{"class":381},[361,4366,386],{"class":385},[361,4368,390],{"class":389},[361,4370,3304],{"class":385},[361,4372,396],{"class":381},[361,4374,4375,4377],{"class":363,"line":700},[361,4376,3311],{"class":389},[361,4378,3314],{"class":406},[361,4380,4381],{"class":363,"line":705},[361,4382,3319],{"class":381},[361,4384,4385,4387],{"class":363,"line":2064},[361,4386,3324],{"class":389},[361,4388,3327],{"class":406},[361,4390,4391,4393],{"class":363,"line":2103},[361,4392,3332],{"class":389},[361,4394,3335],{"class":431},[361,4396,4397],{"class":363,"line":2134},[361,4398,708],{"class":381},[361,4400,4401],{"class":363,"line":2141},[361,4402,375],{"emptyLinePlaceholder":374},[361,4404,4405,4407,4409,4411,4413,4415,4417],{"class":363,"line":2146},[361,4406,382],{"class":381},[361,4408,386],{"class":385},[361,4410,3352],{"class":424},[361,4412,667],{"class":389},[361,4414,1249],{"class":431},[361,4416,435],{"class":385},[361,4418,396],{"class":381},[361,4420,4421,4423],{"class":363,"line":3135},[361,4422,3324],{"class":389},[361,4424,3367],{"class":406},[361,4426,4427,4429],{"class":363,"line":3146},[361,4428,3332],{"class":389},[361,4430,3374],{"class":431},[361,4432,4433],{"class":363,"line":3157},[361,4434,708],{"class":381},[361,4436,4437],{"class":363,"line":3168},[361,4438,375],{"emptyLinePlaceholder":374},[361,4440,4441],{"class":363,"line":3381},[361,4442,3389],{"class":367},[361,4444,4445,4447,4449,4451,4453,4455],{"class":363,"line":3386},[361,4446,3395],{"class":518},[361,4448,522],{"class":389},[361,4450,587],{"class":406},[361,4452,3402],{"class":389},[361,4454,3405],{"class":518},[361,4456,3408],{"class":406},[361,4458,4459,4461,4463,4465,4467,4469],{"class":363,"line":3392},[361,4460,3414],{"class":518},[361,4462,522],{"class":389},[361,4464,587],{"class":406},[361,4466,3402],{"class":389},[361,4468,3423],{"class":518},[361,4470,3408],{"class":406},[361,4472,4473,4475,4477,4479,4481,4483],{"class":363,"line":3411},[361,4474,3431],{"class":518},[361,4476,522],{"class":389},[361,4478,587],{"class":406},[361,4480,3402],{"class":389},[361,4482,3440],{"class":518},[361,4484,3408],{"class":406},[361,4486,4487,4489,4491,4493,4495,4497],{"class":363,"line":3428},[361,4488,3448],{"class":518},[361,4490,522],{"class":389},[361,4492,587],{"class":406},[361,4494,3402],{"class":389},[361,4496,3457],{"class":518},[361,4498,3408],{"class":406},[361,4500,4501],{"class":363,"line":3445},[361,4502,375],{"emptyLinePlaceholder":374},[361,4504,4505],{"class":363,"line":3462},[361,4506,3470],{"class":367},[361,4508,4509,4511,4513,4515,4517,4519,4521],{"class":363,"line":3467},[361,4510,3476],{"class":518},[361,4512,522],{"class":389},[361,4514,525],{"class":406},[361,4516,3483],{"class":389},[361,4518,3486],{"class":406},[361,4520,3489],{"class":518},[361,4522,3492],{"class":406},[361,4524,4525,4527,4529,4531,4533,4535,4537],{"class":363,"line":3473},[361,4526,3498],{"class":518},[361,4528,522],{"class":389},[361,4530,525],{"class":406},[361,4532,3483],{"class":389},[361,4534,3486],{"class":406},[361,4536,3509],{"class":518},[361,4538,3492],{"class":406},[361,4540,4541,4543,4545,4547,4549,4551,4553],{"class":363,"line":3495},[361,4542,3517],{"class":518},[361,4544,522],{"class":389},[361,4546,525],{"class":406},[361,4548,3483],{"class":389},[361,4550,3486],{"class":406},[361,4552,3528],{"class":518},[361,4554,3492],{"class":406},[361,4556,4557,4559,4561,4563,4565,4567,4569],{"class":363,"line":3514},[361,4558,3536],{"class":518},[361,4560,522],{"class":389},[361,4562,525],{"class":406},[361,4564,3483],{"class":389},[361,4566,3486],{"class":406},[361,4568,3547],{"class":518},[361,4570,3492],{"class":406},[361,4572,4573],{"class":363,"line":3533},[361,4574,375],{"emptyLinePlaceholder":374},[361,4576,4577,4579,4581,4583,4585,4587,4589,4591],{"class":363,"line":3552},[361,4578,382],{"class":381},[361,4580,386],{"class":385},[361,4582,549],{"class":389},[361,4584,581],{"class":406},[361,4586,3568],{"class":518},[361,4588,587],{"class":406},[361,4590,435],{"class":385},[361,4592,396],{"class":381},[361,4594,4595,4597],{"class":363,"line":3557},[361,4596,3324],{"class":389},[361,4598,3582],{"class":406},[361,4600,4601,4603],{"class":363,"line":3577},[361,4602,3332],{"class":389},[361,4604,3590],{"class":431},[361,4606,4607],{"class":363,"line":3585},[361,4608,708],{"class":381},[361,4610,4611],{"class":363,"line":3593},[361,4612,375],{"emptyLinePlaceholder":374},[361,4614,4615],{"class":363,"line":3598},[361,4616,3659],{"class":367},[361,4618,4619],{"class":363,"line":3603},[361,4620,3665],{"class":367},[361,4622,4623],{"class":363,"line":3614},[361,4624,3671],{"class":367},[361,4626,4627],{"class":363,"line":3630},[361,4628,3677],{"class":367},[361,4630,4631],{"class":363,"line":3651},[361,4632,375],{"emptyLinePlaceholder":374},[361,4634,4635,4637,4639],{"class":363,"line":3656},[361,4636,3759],{"class":381},[361,4638,3853],{"class":402},[361,4640,2567],{"class":385},[361,4642,4643,4645,4647],{"class":363,"line":3662},[361,4644,578],{"class":389},[361,4646,3863],{"class":431},[361,4648,3866],{"class":406},[361,4650,4651],{"class":363,"line":3668},[361,4652,375],{"emptyLinePlaceholder":374},[361,4654,4655,4657,4659,4661,4663,4665,4667,4669,4671],{"class":363,"line":3674},[361,4656,419],{"class":381},[361,4658,386],{"class":385},[361,4660,390],{"class":389},[361,4662,3795],{"class":385},[361,4664,3498],{"class":518},[361,4666,3800],{"class":385},[361,4668,3517],{"class":518},[361,4670,3891],{"class":385},[361,4672,396],{"class":381},[361,4674,4675,4677,4679,4681,4683,4685,4687],{"class":363,"line":3680},[361,4676,3899],{"class":389},[361,4678,3795],{"class":385},[361,4680,3498],{"class":518},[361,4682,3800],{"class":385},[361,4684,3517],{"class":518},[361,4686,3832],{"class":385},[361,4688,3912],{"class":406},[361,4690,4691],{"class":363,"line":3685},[361,4692,375],{"emptyLinePlaceholder":374},[361,4694,4695,4698,4700,4702,4704,4706,4709],{"class":363,"line":3691},[361,4696,4697],{"class":518},"                BACKUP_ARCHIVE",[361,4699,522],{"class":389},[361,4701,3638],{"class":406},[361,4703,3517],{"class":518},[361,4705,3643],{"class":406},[361,4707,4708],{"class":518},"LAST_BACKUP",[361,4710,3648],{"class":406},[361,4712,4713,4715],{"class":363,"line":3697},[361,4714,3918],{"class":389},[361,4716,3921],{"class":406},[361,4718,4719],{"class":363,"line":3703},[361,4720,3927],{"class":381},[361,4722,4723,4725],{"class":363,"line":3709},[361,4724,3918],{"class":389},[361,4726,3946],{"class":406},[361,4728,4729,4732],{"class":363,"line":3715},[361,4730,4731],{"class":389},"                exit",[361,4733,4734],{"class":431}," 4\n",[361,4736,4737],{"class":363,"line":3721},[361,4738,461],{"class":381},[361,4740,4741],{"class":363,"line":3727},[361,4742,2149],{"class":385},[361,4744,4745],{"class":363,"line":3733},[361,4746,375],{"emptyLinePlaceholder":374},[361,4748,4749,4751,4754],{"class":363,"line":3739},[361,4750,3759],{"class":381},[361,4752,4753],{"class":402}," save_by_network",[361,4755,2567],{"class":385},[361,4757,4758,4760,4762,4765,4768,4771,4774,4776,4779],{"class":363,"line":3745},[361,4759,578],{"class":389},[361,4761,3863],{"class":431},[361,4763,4764],{"class":406}," \"Save on computer ",[361,4766,4767],{"class":518},"$HOST",[361,4769,4770],{"class":406}," as ",[361,4772,4773],{"class":518},"$USER",[361,4775,4094],{"class":406},[361,4777,4778],{"class":518},"$DIR",[361,4780,3408],{"class":406},[361,4782,4783],{"class":363,"line":3751},[361,4784,375],{"emptyLinePlaceholder":374},[361,4786,4787,4790,4792,4795,4798,4801,4804,4807],{"class":363,"line":3756},[361,4788,4789],{"class":402},"        ping",[361,4791,3792],{"class":431},[361,4793,4794],{"class":431}," 3",[361,4796,4797],{"class":431}," -W",[361,4799,4800],{"class":431}," 10",[361,4802,4803],{"class":518}," $HOST",[361,4805,4806],{"class":385}," > ",[361,4808,413],{"class":406},[361,4810,4811],{"class":363,"line":3767},[361,4812,375],{"emptyLinePlaceholder":374},[361,4814,4815,4817,4819,4821,4823,4825,4827],{"class":363,"line":3781},[361,4816,419],{"class":381},[361,4818,386],{"class":385},[361,4820,425],{"class":424},[361,4822,667],{"class":389},[361,4824,432],{"class":431},[361,4826,435],{"class":385},[361,4828,396],{"class":381},[361,4830,4831,4833],{"class":363,"line":3786},[361,4832,3918],{"class":389},[361,4834,4835],{"class":406}," \"failed\"\n",[361,4837,4838],{"class":363,"line":3838},[361,4839,3927],{"class":381},[361,4841,4842,4845,4847,4849,4852,4855,4858],{"class":363,"line":3843},[361,4843,4844],{"class":518},"                DESTINATION",[361,4846,522],{"class":389},[361,4848,3638],{"class":406},[361,4850,4851],{"class":518},"HOST",[361,4853,4854],{"class":406},"}:${",[361,4856,4857],{"class":518},"DIR",[361,4859,3648],{"class":406},[361,4861,4862,4865,4867,4870,4873,4875],{"class":363,"line":3848},[361,4863,4864],{"class":381},"                if",[361,4866,386],{"class":385},[361,4868,4869],{"class":389},"-n",[361,4871,4872],{"class":518}," $USER",[361,4874,435],{"class":385},[361,4876,396],{"class":381},[361,4878,4879,4882,4884,4886,4889,4892,4895],{"class":363,"line":3858},[361,4880,4881],{"class":518},"                        DESTINATION",[361,4883,522],{"class":389},[361,4885,3638],{"class":406},[361,4887,4888],{"class":518},"USER",[361,4890,4891],{"class":406},"}@${",[361,4893,4894],{"class":518},"DESTINATION",[361,4896,3648],{"class":406},[361,4898,4899],{"class":363,"line":3869},[361,4900,4901],{"class":381},"                fi\n",[361,4903,4904,4907,4909,4911,4913,4915,4917,4919],{"class":363,"line":3874},[361,4905,4906],{"class":402},"                scp",[361,4908,3795],{"class":385},[361,4910,3498],{"class":518},[361,4912,3800],{"class":385},[361,4914,3633],{"class":518},[361,4916,3832],{"class":385},[361,4918,1337],{"class":424},[361,4920,4921],{"class":518}," $DESTINATION\n",[361,4923,4924],{"class":363,"line":3896},[361,4925,375],{"emptyLinePlaceholder":374},[361,4927,4928,4930,4932,4934,4936,4938,4940],{"class":363,"line":3915},[361,4929,4864],{"class":381},[361,4931,386],{"class":385},[361,4933,425],{"class":424},[361,4935,667],{"class":389},[361,4937,432],{"class":431},[361,4939,435],{"class":385},[361,4941,396],{"class":381},[361,4943,4944,4947],{"class":363,"line":3924},[361,4945,4946],{"class":389},"                        echo",[361,4948,4835],{"class":406},[361,4950,4951],{"class":363,"line":3930},[361,4952,4953],{"class":381},"                else\n",[361,4955,4956,4958],{"class":363,"line":3941},[361,4957,4946],{"class":389},[361,4959,4960],{"class":406}," \"ok\"\n",[361,4962,4963],{"class":363,"line":3949},[361,4964,4901],{"class":381},[361,4966,4967],{"class":363,"line":3954},[361,4968,461],{"class":381},[361,4970,4971],{"class":363,"line":3959},[361,4972,2149],{"class":385},[361,4974,4975],{"class":363,"line":3964},[361,4976,375],{"emptyLinePlaceholder":374},[361,4978,4979,4981,4984],{"class":363,"line":3974},[361,4980,3759],{"class":381},[361,4982,4983],{"class":402}," save_by_usb",[361,4985,2567],{"class":385},[361,4987,4988,4990,4992,4995,4998],{"class":363,"line":3982},[361,4989,578],{"class":389},[361,4991,3863],{"class":431},[361,4993,4994],{"class":406}," \"Save on drive ",[361,4996,4997],{"class":518},"$DEV",[361,4999,5000],{"class":406}," \"\n",[361,5002,5003],{"class":363,"line":3987},[361,5004,375],{"emptyLinePlaceholder":374},[361,5006,5007,5009,5011,5013,5016,5018],{"class":363,"line":4012},[361,5008,419],{"class":381},[361,5010,386],{"class":385},[361,5012,390],{"class":389},[361,5014,5015],{"class":518}," $DEV",[361,5017,435],{"class":385},[361,5019,396],{"class":381},[361,5021,5022,5025,5027],{"class":363,"line":4038},[361,5023,5024],{"class":518},"                TOUMOUNT",[361,5026,522],{"class":389},[361,5028,4205],{"class":406},[361,5030,5031,5034,5036,5038,5041,5044,5047,5049,5051,5054,5057,5059,5061,5064,5066,5069,5072],{"class":363,"line":4064},[361,5032,5033],{"class":518},"                LINECOUNT",[361,5035,522],{"class":389},[361,5037,525],{"class":406},[361,5039,5040],{"class":402},"mount",[361,5042,5043],{"class":385}," |",[361,5045,5046],{"class":402}," grep",[361,5048,5015],{"class":518},[361,5050,5043],{"class":385},[361,5052,5053],{"class":402}," cut",[361,5055,5056],{"class":431}," -f",[361,5058,1249],{"class":431},[361,5060,605],{"class":431},[361,5062,5063],{"class":389},"\\ ",[361,5065,5043],{"class":385},[361,5067,5068],{"class":402}," wc",[361,5070,5071],{"class":431}," -l",[361,5073,5074],{"class":406}," `\n",[361,5076,5077,5079,5081,5084,5087,5089,5091],{"class":363,"line":4069},[361,5078,4864],{"class":381},[361,5080,386],{"class":385},[361,5082,5083],{"class":518},"$LINECOUNT",[361,5085,5086],{"class":389}," -gt",[361,5088,432],{"class":431},[361,5090,435],{"class":385},[361,5092,396],{"class":381},[361,5094,5095,5098,5100,5102,5104,5106,5108,5110,5112,5114,5116,5118,5120,5122],{"class":363,"line":4074},[361,5096,5097],{"class":518},"                        MOUNTPOINT",[361,5099,522],{"class":389},[361,5101,525],{"class":406},[361,5103,5040],{"class":402},[361,5105,5043],{"class":385},[361,5107,5046],{"class":402},[361,5109,5015],{"class":518},[361,5111,5043],{"class":385},[361,5113,5053],{"class":402},[361,5115,5056],{"class":431},[361,5117,4794],{"class":431},[361,5119,605],{"class":431},[361,5121,5063],{"class":389},[361,5123,3492],{"class":406},[361,5125,5126,5129,5131],{"class":363,"line":4084},[361,5127,5128],{"class":518},"                        TOUMOUNT",[361,5130,522],{"class":389},[361,5132,5133],{"class":406},"0\n",[361,5135,5136],{"class":363,"line":4102},[361,5137,4953],{"class":381},[361,5139,5140,5143],{"class":363,"line":4122},[361,5141,5142],{"class":402},"                        mount",[361,5144,5145],{"class":518}," $MOUNTPOINT\n",[361,5147,5148],{"class":363,"line":4134},[361,5149,375],{"emptyLinePlaceholder":374},[361,5151,5152,5155,5157,5159,5161,5163,5165],{"class":363,"line":4156},[361,5153,5154],{"class":381},"                        if",[361,5156,386],{"class":385},[361,5158,425],{"class":424},[361,5160,667],{"class":389},[361,5162,432],{"class":431},[361,5164,435],{"class":385},[361,5166,396],{"class":381},[361,5168,5169,5172],{"class":363,"line":4185},[361,5170,5171],{"class":389},"                                echo",[361,5173,5174],{"class":406}," \"mount failed \"\n",[361,5176,5177],{"class":363,"line":4190},[361,5178,5179],{"class":381},"                        fi\n",[361,5181,5182],{"class":363,"line":4198},[361,5183,4901],{"class":381},[361,5185,5186,5188,5190,5193,5195,5198,5200,5203,5206],{"class":363,"line":4208},[361,5187,4864],{"class":381},[361,5189,386],{"class":385},[361,5191,5192],{"class":389},"-d",[361,5194,3795],{"class":385},[361,5196,5197],{"class":518},"MOUNTPOINT",[361,5199,3800],{"class":385},[361,5201,5202],{"class":518},"PATHNAME",[361,5204,5205],{"class":385},"} ] ; ",[361,5207,396],{"class":381},[361,5209,5210,5213,5216,5219,5222,5225,5228,5230,5232,5234,5236,5238,5240,5242,5245],{"class":363,"line":4219},[361,5211,5212],{"class":381},"                        for",[361,5214,5215],{"class":518}," FILE",[361,5217,5218],{"class":381}," in",[361,5220,5221],{"class":406}," `",[361,5223,5224],{"class":402},"ls",[361,5226,5227],{"class":431}," -1",[361,5229,3795],{"class":406},[361,5231,3498],{"class":518},[361,5233,3800],{"class":406},[361,5235,3633],{"class":518},[361,5237,3832],{"class":406},[361,5239,1337],{"class":424},[361,5241,525],{"class":406},[361,5243,5244],{"class":385}," ; ",[361,5246,5247],{"class":381},"do\n",[361,5249,5250,5253,5255,5257,5260,5263],{"class":363,"line":4224},[361,5251,5252],{"class":518},"                                FILENAME",[361,5254,522],{"class":389},[361,5256,525],{"class":406},[361,5258,5259],{"class":402},"basename",[361,5261,5262],{"class":518}," $FILE",[361,5264,3492],{"class":406},[361,5266,5267,5270,5272,5274,5276,5278,5280,5282,5284,5287,5289],{"class":363,"line":4229},[361,5268,5269],{"class":381},"                                if",[361,5271,386],{"class":385},[361,5273,390],{"class":389},[361,5275,3795],{"class":385},[361,5277,5197],{"class":518},[361,5279,3800],{"class":385},[361,5281,5202],{"class":518},[361,5283,3800],{"class":385},[361,5285,5286],{"class":518},"FILENAME",[361,5288,5205],{"class":385},[361,5290,396],{"class":381},[361,5292,5293,5296],{"class":363,"line":4234},[361,5294,5295],{"class":389},"                                        echo",[361,5297,5298],{"class":406}," \"exist \"\n",[361,5300,5301],{"class":363,"line":4242},[361,5302,5303],{"class":381},"                                else\n",[361,5305,5306,5309,5311,5314,5316,5318,5320,5322],{"class":363,"line":4250},[361,5307,5308],{"class":402},"                                        cp",[361,5310,3795],{"class":385},[361,5312,5313],{"class":518},"FILE",[361,5315,4178],{"class":385},[361,5317,5197],{"class":518},[361,5319,3800],{"class":385},[361,5321,5202],{"class":518},[361,5323,2149],{"class":385},[361,5325,5326],{"class":363,"line":4258},[361,5327,5328],{"class":381},"                                fi\n",[361,5330,5332],{"class":363,"line":5331},117,[361,5333,5334],{"class":381},"                        done\n",[361,5336,5338],{"class":363,"line":5337},118,[361,5339,375],{"emptyLinePlaceholder":374},[361,5341,5343,5345],{"class":363,"line":5342},119,[361,5344,4946],{"class":389},[361,5346,4960],{"class":406},[361,5348,5350],{"class":363,"line":5349},120,[361,5351,4953],{"class":381},[361,5353,5355,5357],{"class":363,"line":5354},121,[361,5356,4946],{"class":389},[361,5358,4835],{"class":406},[361,5360,5362],{"class":363,"line":5361},122,[361,5363,4901],{"class":381},[361,5365,5367,5369,5371,5374,5377,5379,5381],{"class":363,"line":5366},123,[361,5368,4864],{"class":381},[361,5370,386],{"class":385},[361,5372,5373],{"class":518},"$TOUMOUNT",[361,5375,5376],{"class":389}," -eq",[361,5378,1249],{"class":431},[361,5380,435],{"class":385},[361,5382,396],{"class":381},[361,5384,5386,5389],{"class":363,"line":5385},124,[361,5387,5388],{"class":402},"                        umount",[361,5390,5145],{"class":518},[361,5392,5394],{"class":363,"line":5393},125,[361,5395,4901],{"class":381},[361,5397,5399],{"class":363,"line":5398},126,[361,5400,375],{"emptyLinePlaceholder":374},[361,5402,5404],{"class":363,"line":5403},127,[361,5405,3927],{"class":381},[361,5407,5409,5411],{"class":363,"line":5408},128,[361,5410,3918],{"class":389},[361,5412,5413],{"class":406}," \"device not found\"\n",[361,5415,5417],{"class":363,"line":5416},129,[361,5418,461],{"class":381},[361,5420,5422],{"class":363,"line":5421},130,[361,5423,2149],{"class":385},[361,5425,5427],{"class":363,"line":5426},131,[361,5428,375],{"emptyLinePlaceholder":374},[361,5430,5432,5434,5437],{"class":363,"line":5431},132,[361,5433,3759],{"class":381},[361,5435,5436],{"class":402}," copy_to",[361,5438,2567],{"class":385},[361,5440,5442,5444,5447,5449],{"class":363,"line":5441},133,[361,5443,578],{"class":389},[361,5445,5446],{"class":406}," \"Start make copy of backup ",[361,5448,3568],{"class":518},[361,5450,3408],{"class":406},[361,5452,5454],{"class":363,"line":5453},134,[361,5455,375],{"emptyLinePlaceholder":374},[361,5457,5459,5462,5465,5467,5470,5472],{"class":363,"line":5458},135,[361,5460,5461],{"class":381},"        for",[361,5463,5464],{"class":518}," NAME",[361,5466,5218],{"class":381},[361,5468,5469],{"class":518}," $COPYTO",[361,5471,5244],{"class":385},[361,5473,5247],{"class":381},[361,5475,5477,5480,5482,5484,5486,5489,5492],{"class":363,"line":5476},136,[361,5478,5479],{"class":518},"                var_type",[361,5481,522],{"class":389},[361,5483,587],{"class":406},[361,5485,3402],{"class":389},[361,5487,5488],{"class":406},"${",[361,5490,5491],{"class":518},"NAME",[361,5493,5494],{"class":406},"}_type\"\n",[361,5496,5498,5501,5503,5505,5507,5509,5512],{"class":363,"line":5497},137,[361,5499,5500],{"class":518},"                TYPE",[361,5502,522],{"class":389},[361,5504,525],{"class":406},[361,5506,3483],{"class":389},[361,5508,3486],{"class":406},[361,5510,5511],{"class":518},"$var_type",[361,5513,3492],{"class":406},[361,5515,5517],{"class":363,"line":5516},138,[361,5518,375],{"emptyLinePlaceholder":374},[361,5520,5522,5524,5527,5530,5532,5535],{"class":363,"line":5521},139,[361,5523,3918],{"class":389},[361,5525,5526],{"class":406}," \"--> ",[361,5528,5529],{"class":518},"$NAME",[361,5531,4770],{"class":406},[361,5533,5534],{"class":518},"$TYPE",[361,5536,3408],{"class":406},[361,5538,5540,5543,5546],{"class":363,"line":5539},140,[361,5541,5542],{"class":381},"                case",[361,5544,5545],{"class":518}," $TYPE",[361,5547,5548],{"class":381}," in\n",[361,5550,5552,5555],{"class":363,"line":5551},141,[361,5553,5554],{"class":406},"                        \"usb\"",[361,5556,5557],{"class":385},")\n",[361,5559,5561,5564,5566,5568,5570,5572,5574],{"class":363,"line":5560},142,[361,5562,5563],{"class":518},"                                var_dev",[361,5565,522],{"class":389},[361,5567,587],{"class":406},[361,5569,3402],{"class":389},[361,5571,5488],{"class":406},[361,5573,5491],{"class":518},[361,5575,5576],{"class":406},"}_dev\"\n",[361,5578,5580,5583,5585],{"class":363,"line":5579},143,[361,5581,5582],{"class":518},"                                DEV",[361,5584,522],{"class":389},[361,5586,5587],{"class":385},"`eval echo $var_dev`\n",[361,5589,5591],{"class":363,"line":5590},144,[361,5592,375],{"emptyLinePlaceholder":374},[361,5594,5596,5599,5601,5603,5605],{"class":363,"line":5595},145,[361,5597,5598],{"class":406},"                                var_mountpoint=\"",[361,5600,3402],{"class":389},[361,5602,5488],{"class":406},[361,5604,5491],{"class":518},[361,5606,5607],{"class":406},"}_mountpoint\"\n",[361,5609,5611,5614,5616],{"class":363,"line":5610},146,[361,5612,5613],{"class":518},"                                MOUNTPOINT",[361,5615,522],{"class":389},[361,5617,5618],{"class":385},"`eval echo $var_mountpoint`\n",[361,5620,5622],{"class":363,"line":5621},147,[361,5623,375],{"emptyLinePlaceholder":374},[361,5625,5627,5630,5632,5634,5636],{"class":363,"line":5626},148,[361,5628,5629],{"class":406},"                                var_pathname=\"",[361,5631,3402],{"class":389},[361,5633,5488],{"class":406},[361,5635,5491],{"class":518},[361,5637,5638],{"class":406},"}_pathname\"\n",[361,5640,5642,5645,5647],{"class":363,"line":5641},149,[361,5643,5644],{"class":518},"                                PATHNAME",[361,5646,522],{"class":389},[361,5648,5649],{"class":385},"`eval echo $var_pathname`\n",[361,5651,5653],{"class":363,"line":5652},150,[361,5654,375],{"emptyLinePlaceholder":374},[361,5656,5658,5661],{"class":363,"line":5657},151,[361,5659,5660],{"class":406},"                                save_by_usb",[361,5662,2651],{"class":385},[361,5664,5666],{"class":363,"line":5665},152,[361,5667,5668],{"class":385},"                        ;;\n",[361,5670,5672],{"class":363,"line":5671},153,[361,5673,375],{"emptyLinePlaceholder":374},[361,5675,5677,5680],{"class":363,"line":5676},154,[361,5678,5679],{"class":406},"                        \"net\"",[361,5681,5557],{"class":385},[361,5683,5685,5688,5690,5692,5694,5696,5698],{"class":363,"line":5684},155,[361,5686,5687],{"class":518},"                                var_host",[361,5689,522],{"class":389},[361,5691,587],{"class":406},[361,5693,3402],{"class":389},[361,5695,5488],{"class":406},[361,5697,5491],{"class":518},[361,5699,5700],{"class":406},"}_host\"\n",[361,5702,5704,5707,5709],{"class":363,"line":5703},156,[361,5705,5706],{"class":518},"                                HOST",[361,5708,522],{"class":389},[361,5710,5711],{"class":385},"`eval echo $var_host`\n",[361,5713,5715],{"class":363,"line":5714},157,[361,5716,375],{"emptyLinePlaceholder":374},[361,5718,5720,5723,5725,5727,5729],{"class":363,"line":5719},158,[361,5721,5722],{"class":406},"                                var_user=\"",[361,5724,3402],{"class":389},[361,5726,5488],{"class":406},[361,5728,5491],{"class":518},[361,5730,5731],{"class":406},"}_user\"\n",[361,5733,5735,5738,5740],{"class":363,"line":5734},159,[361,5736,5737],{"class":518},"                                USER",[361,5739,522],{"class":389},[361,5741,5742],{"class":385},"`eval echo $var_user`\n",[361,5744,5746],{"class":363,"line":5745},160,[361,5747,375],{"emptyLinePlaceholder":374},[361,5749,5751,5754,5756,5758,5760],{"class":363,"line":5750},161,[361,5752,5753],{"class":406},"                                var_dir=\"",[361,5755,3402],{"class":389},[361,5757,5488],{"class":406},[361,5759,5491],{"class":518},[361,5761,5762],{"class":406},"}_dir\"\n",[361,5764,5766,5769,5771],{"class":363,"line":5765},162,[361,5767,5768],{"class":518},"                                DIR",[361,5770,522],{"class":389},[361,5772,5773],{"class":385},"`eval echo $var_dir`\n",[361,5775,5777],{"class":363,"line":5776},163,[361,5778,375],{"emptyLinePlaceholder":374},[361,5780,5782,5785],{"class":363,"line":5781},164,[361,5783,5784],{"class":406},"                                save_by_network",[361,5786,2651],{"class":385},[361,5788,5790],{"class":363,"line":5789},165,[361,5791,5668],{"class":385},[361,5793,5795],{"class":363,"line":5794},166,[361,5796,5797],{"class":381},"                esac\n",[361,5799,5801],{"class":363,"line":5800},167,[361,5802,5803],{"class":381},"        done\n",[361,5805,5807],{"class":363,"line":5806},168,[361,5808,2149],{"class":385},[361,5810,5812],{"class":363,"line":5811},169,[361,5813,375],{"emptyLinePlaceholder":374},[361,5815,5817,5820],{"class":363,"line":5816},170,[361,5818,5819],{"class":402},"copy_to",[361,5821,2651],{"class":385},[762,5823,5824],{},"html pre.shiki code .sV9Aq, html code.shiki .sV9Aq{--shiki-default:#7F848E;--shiki-default-font-style:italic}html pre.shiki code .sVyAn, html code.shiki .sVyAn{--shiki-default:#E06C75}html pre.shiki code .sjrmR, html code.shiki .sjrmR{--shiki-default:#56B6C2}html pre.shiki code .subq3, html code.shiki .subq3{--shiki-default:#98C379}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .seHd6, html code.shiki .seHd6{--shiki-default:#C678DD}html pre.shiki code .sn6KH, html code.shiki .sn6KH{--shiki-default:#ABB2BF}html pre.shiki code .sVC51, html code.shiki .sVC51{--shiki-default:#D19A66}html pre.shiki code .sU0A5, html code.shiki .sU0A5{--shiki-default:#E5C07B}html pre.shiki code .sVbv2, html code.shiki .sVbv2{--shiki-default:#61AFEF}",{"title":59,"searchDepth":371,"depth":371,"links":5826},[5827,5828,5829],{"id":2902,"depth":378,"text":2903},{"id":3178,"depth":378,"text":3179},{"id":4266,"depth":378,"text":4267},"2006-10-16","Ce billet concerne une application, de mon cru, écrite en bash.",{"type":8,"value":5833},[5834,5838,5842,5848,5850],[11,5835,2873,5836,831],{},[36,5837,357],{},[11,5839,2878,5840,2882],{},[36,5841,2881],{},[11,5843,2885,5844,2889,5846,2893],{},[36,5845,2888],{},[36,5847,2892],{},[11,5849,2896],{},[11,5851,2899],{},{},"\u002Fpost\u002Fsauvegarde-automatique",{"title":2868,"description":5831},"posts\u002FSysAdmin\u002F2006-10-16-sauvegarde-automatique",[795],"tiOqKpPKnPayGrhb8Ovj19GWXvi-3rDyhtkkPwFVK5Q",{"id":5859,"title":5860,"author":6,"body":5861,"category":775,"categorySlug":776,"date":7958,"description":7959,"excerpt":7960,"extension":786,"location":787,"meta":7970,"navigation":374,"path":7971,"published":374,"seo":7972,"slug":7973,"stem":7974,"tags":7975,"timeToRead":440,"__hash__":7976},"posts\u002Fposts\u002FSysAdmin\u002F2006-08-20-script-linux.md","Script Linux",{"type":8,"value":5862,"toc":7948},[5863,5874,5877,5881,5891,5967,5981,5985,5988,6047,6051,6070,6378,6382,6385,6506,6510,6517,6807,6811,6824,6954,6958,6978,7307,7311,7324,7945],[11,5864,5865,5866,5869,5870,5873],{},"Ce billet est consacré au script Linux. J'ai écrit divers script pour\n\"automatiser\" certaines commandes, ",[179,5867,5868],{},"même si je dois exécuter ces\nscripts manuellement",". Je pourrais, quand bien même, appeler ces scripts\ndans un ",[36,5871,5872],{},"cron"," si je le souhaitais.",[11,5875,5876],{},"Vous trouverez, donc, dans la suite, différents scripts, différentes\nidées, à améliorer, à récupérer.",[21,5878,5880],{"id":5879},"liste-des-paquets","Liste des paquets",[11,5882,5883,5884,5887,5888,831],{},"Ce script permet de lister les paquets installés sur un système\nGNU\\Debian. Cela me permet de récupérer une liste de paquet dans un\nfichier, liste que je peux réutiliser dans un logiciel comme synaptic\npour installer les mêmes paquets sur une autre distribution.Couplé à une\nsauvegarde du dossier home et du dossier etc, le script permet de\npouvoir réinstaller un système à l'identique (à condition que l'on ne se\ntrouve pas sur ",[179,5885,5886],{},"unstable"," et moyennant le dossier ",[36,5889,5890],{},"\u002Fvar",[51,5892,5894],{"className":355,"code":5893,"language":357,"meta":59,"style":59},"liste=`dpkg -l | tail +6 | cut -d\\  -f3`\nfor i in $liste ; do\n    echo \"$i        install\"\ndone\n",[36,5895,5896,5932,5949,5962],{"__ignoreMap":59},[361,5897,5898,5901,5903,5905,5908,5910,5912,5915,5918,5921,5923,5925,5927,5930],{"class":363,"line":364},[361,5899,5900],{"class":518},"liste",[361,5902,522],{"class":389},[361,5904,525],{"class":406},[361,5906,5907],{"class":402},"dpkg",[361,5909,5071],{"class":431},[361,5911,5043],{"class":385},[361,5913,5914],{"class":402}," tail",[361,5916,5917],{"class":406}," +6 ",[361,5919,5920],{"class":385},"|",[361,5922,5053],{"class":402},[361,5924,605],{"class":431},[361,5926,5063],{"class":389},[361,5928,5929],{"class":431}," -f3",[361,5931,3492],{"class":406},[361,5933,5934,5937,5940,5942,5945,5947],{"class":363,"line":371},[361,5935,5936],{"class":381},"for",[361,5938,5939],{"class":518}," i",[361,5941,5218],{"class":381},[361,5943,5944],{"class":518}," $liste",[361,5946,5244],{"class":385},[361,5948,5247],{"class":381},[361,5950,5951,5954,5956,5959],{"class":363,"line":378},[361,5952,5953],{"class":389},"    echo",[361,5955,581],{"class":406},[361,5957,5958],{"class":518},"$i",[361,5960,5961],{"class":406},"        install\"\n",[361,5963,5964],{"class":363,"line":399},[361,5965,5966],{"class":381},"done\n",[11,5968,5969],{},[5970,5971,5972,5973,5976,5977,5980],"ins",{},"La commande ",[36,5974,5975],{},"dpkg --get-selections"," peut très bien remplacer le\nscript ci-dessus. Merci à ",[179,5978,5979],{},"mx"," pour sa remarque.",[21,5982,5984],{"id":5983},"purge-des-paquets","Purge des paquets",[11,5986,5987],{},"Permet de purger les paquets supprimés d'une distribution GNU\\Debian.\nCela permet de supprimer les quelques fichiers inutiles lors de la\nsuppression de paquet GNU\\Debian. Néanmoins, parfois on ne veut pas\nfaire les purges.",[51,5989,5991],{"className":355,"code":5990,"language":357,"meta":59,"style":59},"for i in `dpkg -l | grep -e '^rc.*' | cut -f3 -d\\ ` ; do dpkg -P $i ; done\n",[36,5992,5993],{"__ignoreMap":59},[361,5994,5995,5997,5999,6001,6003,6005,6007,6009,6011,6014,6017,6019,6021,6023,6025,6027,6029,6031,6034,6037,6040,6043,6045],{"class":363,"line":364},[361,5996,5936],{"class":381},[361,5998,5939],{"class":518},[361,6000,5218],{"class":381},[361,6002,5221],{"class":406},[361,6004,5907],{"class":402},[361,6006,5071],{"class":431},[361,6008,5043],{"class":385},[361,6010,5046],{"class":402},[361,6012,6013],{"class":431}," -e",[361,6015,6016],{"class":406}," '^rc.*' ",[361,6018,5920],{"class":385},[361,6020,5053],{"class":402},[361,6022,5929],{"class":431},[361,6024,605],{"class":431},[361,6026,5063],{"class":389},[361,6028,525],{"class":406},[361,6030,5244],{"class":385},[361,6032,6033],{"class":381},"do",[361,6035,6036],{"class":402}," dpkg",[361,6038,6039],{"class":431}," -P",[361,6041,6042],{"class":518}," $i",[361,6044,5244],{"class":385},[361,6046,5966],{"class":381},[21,6048,6050],{"id":6049},"sécurisation-des-données","Sécurisation des données",[11,6052,6053,6054,6057,6058,6061,6062,6065,6066,6069],{},"Permet de monter une partition démontée et démonter une partition\nmontée. Ce script est basé sur KDialog pour demander les informations,\nil nécessite donc KDE (mais je pense qu'il est possible de le réécrire\npour Gnome).On lui passe en paramètre le nom d'un périphérique. Il\nsuppose que la partition démontée est un volume logique (sous LVM) dont\nle groupe est GNU\\Debian et dont le nom est ",[36,6055,6056],{},"$DISK-close",". Il crée à\nla suite le ",[179,6059,6060],{},"device-mapper"," (en supposant qu'il a été créé à l'aide de\n",[179,6063,6064],{},"LUKS",") du nom de ",[36,6067,6068],{},"$DISK-open",".S'il trouve ce \"device-mapper\", il le\ndémonte et le supprime.",[51,6071,6073],{"className":355,"code":6072,"language":357,"meta":59,"style":59},"#!\u002Fbin\u002Fsh\n\nDISK=$1\nDISKOPEN=\"$DISK-open\"\nDISKCLOSE=\"$DISK-close\"\n\nif [ -e \u002Fdev\u002Fmapper\u002F$DISKOPEN ] ; then\n        umount \u002Fdev\u002Fmapper\u002F$DISKOPEN 2> \u002Fdev\u002Fnull\n        if [ $? != 0 ] ; then\n                kdialog --title KSecure --error \"Impossible de démonter le péripherique $DISK\"\n        fi\n                if [ -e \u002Fdev\u002Fmapper\u002F$DISKOPEN ] ; then\n                \u002Fsbin\u002Fcryptsetup luksClose $DISKOPEN\n                                kdialog --title KSecure --msgbox \"Suppression du péripherique $DISK accomplie\"\n                fi\nelse\n        password=`kdialog --title KSecure --password \"Cle de déchiffrement de $DISK\"`\n        if [ -z $password ] ; then\n                password=\"nopassword\"\n        fi\n        echo \"$password\" | \\\n                \u002Fsbin\u002Fcryptsetup luksOpen \u002Fdev\u002Fdebian\u002F$DISKCLOSE $DISKOPEN 2> \u002Fdev\u002Fnull\n        mount \u002Fdev\u002Fmapper\u002F$DISKOPEN 2> \u002Fdev\u002Fnull\n                if [ $? -ne  0 ] ; then\n                                kdialog --title KSecure --error \"Clé incorrecte\"\n                fi\nfi\n",[36,6074,6075,6079,6083,6093,6108,6122,6126,6144,6156,6172,6189,6193,6209,6219,6238,6242,6246,6270,6284,6292,6296,6310,6330,6342,6358,6370,6374],{"__ignoreMap":59},[361,6076,6077],{"class":363,"line":364},[361,6078,368],{"class":367},[361,6080,6081],{"class":363,"line":371},[361,6082,375],{"emptyLinePlaceholder":374},[361,6084,6085,6088,6090],{"class":363,"line":378},[361,6086,6087],{"class":518},"DISK",[361,6089,522],{"class":389},[361,6091,6092],{"class":1015},"$1\n",[361,6094,6095,6098,6100,6102,6105],{"class":363,"line":399},[361,6096,6097],{"class":518},"DISKOPEN",[361,6099,522],{"class":389},[361,6101,587],{"class":406},[361,6103,6104],{"class":518},"$DISK",[361,6106,6107],{"class":406},"-open\"\n",[361,6109,6110,6113,6115,6117,6119],{"class":363,"line":416},[361,6111,6112],{"class":518},"DISKCLOSE",[361,6114,522],{"class":389},[361,6116,587],{"class":406},[361,6118,6104],{"class":518},[361,6120,6121],{"class":406},"-close\"\n",[361,6123,6124],{"class":363,"line":440},[361,6125,375],{"emptyLinePlaceholder":374},[361,6127,6128,6130,6132,6134,6137,6140,6142],{"class":363,"line":458},[361,6129,382],{"class":381},[361,6131,386],{"class":385},[361,6133,390],{"class":389},[361,6135,6136],{"class":385}," \u002Fdev\u002Fmapper\u002F",[361,6138,6139],{"class":518},"$DISKOPEN",[361,6141,435],{"class":385},[361,6143,396],{"class":381},[361,6145,6146,6148,6150,6152,6154],{"class":363,"line":464},[361,6147,403],{"class":402},[361,6149,6136],{"class":406},[361,6151,6139],{"class":518},[361,6153,410],{"class":385},[361,6155,413],{"class":406},[361,6157,6158,6160,6162,6164,6166,6168,6170],{"class":363,"line":477},[361,6159,419],{"class":381},[361,6161,386],{"class":385},[361,6163,425],{"class":424},[361,6165,428],{"class":389},[361,6167,432],{"class":431},[361,6169,435],{"class":385},[361,6171,396],{"class":381},[361,6173,6174,6176,6178,6180,6182,6185,6187],{"class":363,"line":489},[361,6175,443],{"class":402},[361,6177,446],{"class":431},[361,6179,449],{"class":406},[361,6181,452],{"class":431},[361,6183,6184],{"class":406}," \"Impossible de démonter le péripherique ",[361,6186,6104],{"class":518},[361,6188,3408],{"class":406},[361,6190,6191],{"class":363,"line":504},[361,6192,461],{"class":381},[361,6194,6195,6197,6199,6201,6203,6205,6207],{"class":363,"line":509},[361,6196,4864],{"class":381},[361,6198,386],{"class":385},[361,6200,390],{"class":389},[361,6202,6136],{"class":385},[361,6204,6139],{"class":518},[361,6206,435],{"class":385},[361,6208,396],{"class":381},[361,6210,6211,6213,6216],{"class":363,"line":515},[361,6212,480],{"class":402},[361,6214,6215],{"class":406}," luksClose",[361,6217,6218],{"class":518}," $DISKOPEN\n",[361,6220,6221,6224,6226,6228,6230,6233,6235],{"class":363,"line":542},[361,6222,6223],{"class":402},"                                kdialog",[361,6225,446],{"class":431},[361,6227,449],{"class":406},[361,6229,498],{"class":431},[361,6231,6232],{"class":406}," \"Suppression du péripherique ",[361,6234,6104],{"class":518},[361,6236,6237],{"class":406}," accomplie\"\n",[361,6239,6240],{"class":363,"line":559},[361,6241,4901],{"class":381},[361,6243,6244],{"class":363,"line":570},[361,6245,3319],{"class":381},[361,6247,6248,6250,6252,6254,6256,6258,6260,6262,6265,6267],{"class":363,"line":575},[361,6249,519],{"class":518},[361,6251,522],{"class":389},[361,6253,525],{"class":406},[361,6255,528],{"class":402},[361,6257,446],{"class":431},[361,6259,533],{"class":406},[361,6261,536],{"class":431},[361,6263,6264],{"class":406}," \"Cle de déchiffrement de ",[361,6266,6104],{"class":518},[361,6268,6269],{"class":406},"\"`\n",[361,6271,6272,6274,6276,6278,6280,6282],{"class":363,"line":596},[361,6273,419],{"class":381},[361,6275,386],{"class":385},[361,6277,549],{"class":389},[361,6279,552],{"class":518},[361,6281,435],{"class":385},[361,6283,396],{"class":381},[361,6285,6286,6288,6290],{"class":363,"line":627},[361,6287,562],{"class":518},[361,6289,522],{"class":389},[361,6291,567],{"class":406},[361,6293,6294],{"class":363,"line":646},[361,6295,461],{"class":381},[361,6297,6298,6300,6302,6304,6306,6308],{"class":363,"line":658},[361,6299,578],{"class":389},[361,6301,581],{"class":406},[361,6303,584],{"class":518},[361,6305,587],{"class":406},[361,6307,590],{"class":385},[361,6309,593],{"class":389},[361,6311,6312,6314,6317,6320,6323,6326,6328],{"class":363,"line":677},[361,6313,480],{"class":402},[361,6315,6316],{"class":406}," luksOpen",[361,6318,6319],{"class":406}," \u002Fdev\u002Fdebian\u002F",[361,6321,6322],{"class":518},"$DISKCLOSE",[361,6324,6325],{"class":518}," $DISKOPEN",[361,6327,410],{"class":385},[361,6329,413],{"class":406},[361,6331,6332,6334,6336,6338,6340],{"class":363,"line":691},[361,6333,649],{"class":402},[361,6335,6136],{"class":406},[361,6337,6139],{"class":518},[361,6339,410],{"class":385},[361,6341,413],{"class":406},[361,6343,6344,6346,6348,6350,6352,6354,6356],{"class":363,"line":700},[361,6345,4864],{"class":381},[361,6347,386],{"class":385},[361,6349,425],{"class":424},[361,6351,667],{"class":389},[361,6353,670],{"class":431},[361,6355,435],{"class":385},[361,6357,396],{"class":381},[361,6359,6360,6362,6364,6366,6368],{"class":363,"line":705},[361,6361,6223],{"class":402},[361,6363,446],{"class":431},[361,6365,449],{"class":406},[361,6367,452],{"class":431},[361,6369,688],{"class":406},[361,6371,6372],{"class":363,"line":2064},[361,6373,4901],{"class":381},[361,6375,6376],{"class":363,"line":2103},[361,6377,708],{"class":381},[21,6379,6381],{"id":6380},"apprentissage-du-spam","Apprentissage du spam",[11,6383,6384],{},"Permet d'appeler bogofliter et spamassassin sur une liste de message\nIndésirable au format mbox. Il permet aussi de faire l'apprentissage des\nmessages désirables.",[51,6386,6388],{"className":355,"code":6387,"language":357,"meta":59,"style":59},"#!\u002Fbin\u002Fbash\n\nsa-learn -L --no-sync --spam --mbox \u002Fhome\u002Fphoenix\u002FMail\u002FIndésirable\\ \\(Spam\\)\nsa-learn -L --no-sync --ham --mbox \u002Fhome\u002Fphoenix\u002FMail\u002FDésirable\\ \\(Non\\ spam\\)\n\nbogofilter -N -s \u003C \u002Fhome\u002Fphoenix\u002FMail\u002FIndésirable\\ \\(Spam\\)\nbogofilter -S -n \u003C \u002Fhome\u002Fphoenix\u002FMail\u002FDésirable\\ \\(Non\\ spam\\)\n",[36,6389,6390,6395,6399,6428,6456,6460,6482],{"__ignoreMap":59},[361,6391,6392],{"class":363,"line":364},[361,6393,6394],{"class":367},"#!\u002Fbin\u002Fbash\n",[361,6396,6397],{"class":363,"line":371},[361,6398,375],{"emptyLinePlaceholder":374},[361,6400,6401,6404,6407,6410,6413,6416,6419,6422,6425],{"class":363,"line":378},[361,6402,6403],{"class":402},"sa-learn",[361,6405,6406],{"class":431}," -L",[361,6408,6409],{"class":431}," --no-sync",[361,6411,6412],{"class":431}," --spam",[361,6414,6415],{"class":431}," --mbox",[361,6417,6418],{"class":406}," \u002Fhome\u002Fphoenix\u002FMail\u002FIndésirable",[361,6420,6421],{"class":389},"\\ \\(",[361,6423,6424],{"class":406},"Spam",[361,6426,6427],{"class":389},"\\)\n",[361,6429,6430,6432,6434,6436,6439,6441,6444,6446,6449,6451,6454],{"class":363,"line":399},[361,6431,6403],{"class":402},[361,6433,6406],{"class":431},[361,6435,6409],{"class":431},[361,6437,6438],{"class":431}," --ham",[361,6440,6415],{"class":431},[361,6442,6443],{"class":406}," \u002Fhome\u002Fphoenix\u002FMail\u002FDésirable",[361,6445,6421],{"class":389},[361,6447,6448],{"class":406},"Non",[361,6450,5063],{"class":389},[361,6452,6453],{"class":406},"spam",[361,6455,6427],{"class":389},[361,6457,6458],{"class":363,"line":416},[361,6459,375],{"emptyLinePlaceholder":374},[361,6461,6462,6465,6468,6470,6473,6476,6478,6480],{"class":363,"line":440},[361,6463,6464],{"class":402},"bogofilter",[361,6466,6467],{"class":431}," -N",[361,6469,900],{"class":431},[361,6471,6472],{"class":385}," \u003C ",[361,6474,6475],{"class":406},"\u002Fhome\u002Fphoenix\u002FMail\u002FIndésirable",[361,6477,6421],{"class":389},[361,6479,6424],{"class":406},[361,6481,6427],{"class":389},[361,6483,6484,6486,6489,6491,6493,6496,6498,6500,6502,6504],{"class":363,"line":458},[361,6485,6464],{"class":402},[361,6487,6488],{"class":431}," -S",[361,6490,3863],{"class":431},[361,6492,6472],{"class":385},[361,6494,6495],{"class":406},"\u002Fhome\u002Fphoenix\u002FMail\u002FDésirable",[361,6497,6421],{"class":389},[361,6499,6448],{"class":406},[361,6501,5063],{"class":389},[361,6503,6453],{"class":406},[361,6505,6427],{"class":389},[21,6507,6509],{"id":6508},"création-de-lien","Création de lien",[11,6511,6512,6513,6516],{},"Permet à partir d'une liste de fichier identique générée par ",[179,6514,6515],{},"fdupes"," de\ncréer des liens physiques entre les fichiers pour économiser de la\nplace. Attention : si un des fichiers physiques est modifié, l'autre le\nsera aussi.",[51,6518,6520],{"className":355,"code":6519,"language":357,"meta":59,"style":59},"#!\u002Fbin\u002Fsh\n\necho -n \"|\"\nread -r line\nwhile [ $? -eq 0 ] ; do\n        line=`echo $line | sed -e \"s\u002F\\\\\\\\\\\\ \u002F@\u002Fg\"`\n        index=0\n        principal=\"\"\n        for chemin in $line ; do\n                if [ $index -eq 0 ] ; then\n                        principal=$chemin\n                else\n                        a=`echo $principal | sed -e \"s\u002F@\u002F\\\\ \u002Fg\"`\n                        b=`echo $chemin | sed -e \"s\u002F@\u002F\\\\ \u002Fg\"`\n                        ln -f \"$a\" \"$b\"\n                fi\n\n                index=`expr $index + 1`\n        done\n\n        echo -n \"=\"\n\n        read -r line\ndone\necho -n \"|\"\n",[36,6521,6522,6526,6530,6539,6550,6567,6597,6606,6616,6631,6648,6658,6662,6690,6716,6737,6741,6745,6765,6769,6773,6782,6786,6795,6799],{"__ignoreMap":59},[361,6523,6524],{"class":363,"line":364},[361,6525,368],{"class":367},[361,6527,6528],{"class":363,"line":371},[361,6529,375],{"emptyLinePlaceholder":374},[361,6531,6532,6534,6536],{"class":363,"line":378},[361,6533,3324],{"class":389},[361,6535,3863],{"class":431},[361,6537,6538],{"class":406}," \"|\"\n",[361,6540,6541,6544,6547],{"class":363,"line":399},[361,6542,6543],{"class":389},"read",[361,6545,6546],{"class":431}," -r",[361,6548,6549],{"class":406}," line\n",[361,6551,6552,6555,6557,6559,6561,6563,6565],{"class":363,"line":416},[361,6553,6554],{"class":381},"while",[361,6556,386],{"class":385},[361,6558,425],{"class":424},[361,6560,5376],{"class":389},[361,6562,432],{"class":431},[361,6564,435],{"class":385},[361,6566,5247],{"class":381},[361,6568,6569,6572,6574,6576,6578,6581,6583,6586,6588,6591,6594],{"class":363,"line":440},[361,6570,6571],{"class":518},"        line",[361,6573,522],{"class":389},[361,6575,525],{"class":406},[361,6577,3324],{"class":389},[361,6579,6580],{"class":518}," $line",[361,6582,5043],{"class":385},[361,6584,6585],{"class":402}," sed",[361,6587,6013],{"class":431},[361,6589,6590],{"class":406}," \"s\u002F",[361,6592,6593],{"class":389},"\\\\\\\\\\\\",[361,6595,6596],{"class":406}," \u002F@\u002Fg\"`\n",[361,6598,6599,6602,6604],{"class":363,"line":458},[361,6600,6601],{"class":518},"        index",[361,6603,522],{"class":389},[361,6605,5133],{"class":406},[361,6607,6608,6611,6613],{"class":363,"line":464},[361,6609,6610],{"class":518},"        principal",[361,6612,522],{"class":389},[361,6614,6615],{"class":406},"\"\"\n",[361,6617,6618,6620,6623,6625,6627,6629],{"class":363,"line":477},[361,6619,5461],{"class":381},[361,6621,6622],{"class":518}," chemin",[361,6624,5218],{"class":381},[361,6626,6580],{"class":518},[361,6628,5244],{"class":385},[361,6630,5247],{"class":381},[361,6632,6633,6635,6637,6640,6642,6644,6646],{"class":363,"line":489},[361,6634,4864],{"class":381},[361,6636,386],{"class":385},[361,6638,6639],{"class":518},"$index",[361,6641,5376],{"class":389},[361,6643,432],{"class":431},[361,6645,435],{"class":385},[361,6647,396],{"class":381},[361,6649,6650,6653,6655],{"class":363,"line":504},[361,6651,6652],{"class":518},"                        principal",[361,6654,522],{"class":389},[361,6656,6657],{"class":518},"$chemin\n",[361,6659,6660],{"class":363,"line":509},[361,6661,4953],{"class":381},[361,6663,6664,6667,6669,6671,6673,6676,6678,6680,6682,6685,6687],{"class":363,"line":515},[361,6665,6666],{"class":518},"                        a",[361,6668,522],{"class":389},[361,6670,525],{"class":406},[361,6672,3324],{"class":389},[361,6674,6675],{"class":518}," $principal",[361,6677,5043],{"class":385},[361,6679,6585],{"class":402},[361,6681,6013],{"class":431},[361,6683,6684],{"class":406}," \"s\u002F@\u002F",[361,6686,2668],{"class":389},[361,6688,6689],{"class":406}," \u002Fg\"`\n",[361,6691,6692,6695,6697,6699,6701,6704,6706,6708,6710,6712,6714],{"class":363,"line":542},[361,6693,6694],{"class":518},"                        b",[361,6696,522],{"class":389},[361,6698,525],{"class":406},[361,6700,3324],{"class":389},[361,6702,6703],{"class":518}," $chemin",[361,6705,5043],{"class":385},[361,6707,6585],{"class":402},[361,6709,6013],{"class":431},[361,6711,6684],{"class":406},[361,6713,2668],{"class":389},[361,6715,6689],{"class":406},[361,6717,6718,6721,6723,6725,6728,6730,6732,6735],{"class":363,"line":559},[361,6719,6720],{"class":402},"                        ln",[361,6722,5056],{"class":431},[361,6724,581],{"class":406},[361,6726,6727],{"class":518},"$a",[361,6729,587],{"class":406},[361,6731,581],{"class":406},[361,6733,6734],{"class":518},"$b",[361,6736,3408],{"class":406},[361,6738,6739],{"class":363,"line":570},[361,6740,4901],{"class":381},[361,6742,6743],{"class":363,"line":575},[361,6744,375],{"emptyLinePlaceholder":374},[361,6746,6747,6750,6752,6754,6756,6759,6761,6763],{"class":363,"line":596},[361,6748,6749],{"class":518},"                index",[361,6751,522],{"class":389},[361,6753,525],{"class":406},[361,6755,4143],{"class":402},[361,6757,6758],{"class":518}," $index",[361,6760,4149],{"class":406},[361,6762,83],{"class":431},[361,6764,3492],{"class":406},[361,6766,6767],{"class":363,"line":627},[361,6768,5803],{"class":381},[361,6770,6771],{"class":363,"line":646},[361,6772,375],{"emptyLinePlaceholder":374},[361,6774,6775,6777,6779],{"class":363,"line":658},[361,6776,578],{"class":389},[361,6778,3863],{"class":431},[361,6780,6781],{"class":406}," \"=\"\n",[361,6783,6784],{"class":363,"line":677},[361,6785,375],{"emptyLinePlaceholder":374},[361,6787,6788,6791,6793],{"class":363,"line":691},[361,6789,6790],{"class":389},"        read",[361,6792,6546],{"class":431},[361,6794,6549],{"class":406},[361,6796,6797],{"class":363,"line":700},[361,6798,5966],{"class":381},[361,6800,6801,6803,6805],{"class":363,"line":705},[361,6802,3324],{"class":389},[361,6804,3863],{"class":431},[361,6806,6538],{"class":406},[21,6808,6810],{"id":6809},"renumérotation","Renumérotation",[11,6812,6813,6814,6817,6818,6820,6821],{},"Permet de renuméroté une liste d'image d'un dossier, du style\n",[36,6815,6816],{},"1 10 11 12 13 2 3 4..."," en une suite précédé d'un ",[36,6819,1195],{}," :\n",[36,6822,6823],{},"01 02 03 04 05 06 ...",[51,6825,6827],{"className":355,"code":6826,"language":357,"meta":59,"style":59},"#!\u002Fbin\u002Fsh\n\nfor DIR in `ls` ; do\n\n    echo -n \"Change directory $DIR \"\n\n    cd $DIR\n\n    CMD=`ls | sed -e 's\u002F\\(.*\\)_\\([1-9]\\)\\.jpg\u002Fmv \\1_\\2.jpg \\1_0\\2.jpg ;\u002Fg' | grep \"mv \"`\n    eval $CMD\n\n    cd ..\n\n    echo \"Ok\"\n\ndone\n",[36,6828,6829,6833,6837,6856,6860,6873,6877,6885,6889,6916,6924,6928,6935,6939,6946,6950],{"__ignoreMap":59},[361,6830,6831],{"class":363,"line":364},[361,6832,368],{"class":367},[361,6834,6835],{"class":363,"line":371},[361,6836,375],{"emptyLinePlaceholder":374},[361,6838,6839,6841,6844,6846,6848,6850,6852,6854],{"class":363,"line":378},[361,6840,5936],{"class":381},[361,6842,6843],{"class":518}," DIR",[361,6845,5218],{"class":381},[361,6847,5221],{"class":406},[361,6849,5224],{"class":402},[361,6851,525],{"class":406},[361,6853,5244],{"class":385},[361,6855,5247],{"class":381},[361,6857,6858],{"class":363,"line":399},[361,6859,375],{"emptyLinePlaceholder":374},[361,6861,6862,6864,6866,6869,6871],{"class":363,"line":416},[361,6863,5953],{"class":389},[361,6865,3863],{"class":431},[361,6867,6868],{"class":406}," \"Change directory ",[361,6870,4778],{"class":518},[361,6872,5000],{"class":406},[361,6874,6875],{"class":363,"line":440},[361,6876,375],{"emptyLinePlaceholder":374},[361,6878,6879,6882],{"class":363,"line":458},[361,6880,6881],{"class":389},"    cd",[361,6883,6884],{"class":518}," $DIR\n",[361,6886,6887],{"class":363,"line":464},[361,6888,375],{"emptyLinePlaceholder":374},[361,6890,6891,6894,6896,6898,6900,6902,6904,6906,6909,6911,6913],{"class":363,"line":477},[361,6892,6893],{"class":518},"    CMD",[361,6895,522],{"class":389},[361,6897,525],{"class":406},[361,6899,5224],{"class":402},[361,6901,5043],{"class":385},[361,6903,6585],{"class":402},[361,6905,6013],{"class":431},[361,6907,6908],{"class":406}," 's\u002F\\(.*\\)_\\([1-9]\\)\\.jpg\u002Fmv \\1_\\2.jpg \\1_0\\2.jpg ;\u002Fg' ",[361,6910,5920],{"class":385},[361,6912,5046],{"class":402},[361,6914,6915],{"class":406}," \"mv \"`\n",[361,6917,6918,6921],{"class":363,"line":489},[361,6919,6920],{"class":389},"    eval",[361,6922,6923],{"class":518}," $CMD\n",[361,6925,6926],{"class":363,"line":504},[361,6927,375],{"emptyLinePlaceholder":374},[361,6929,6930,6932],{"class":363,"line":509},[361,6931,6881],{"class":389},[361,6933,6934],{"class":406}," ..\n",[361,6936,6937],{"class":363,"line":515},[361,6938,375],{"emptyLinePlaceholder":374},[361,6940,6941,6943],{"class":363,"line":542},[361,6942,5953],{"class":389},[361,6944,6945],{"class":406}," \"Ok\"\n",[361,6947,6948],{"class":363,"line":559},[361,6949,375],{"emptyLinePlaceholder":374},[361,6951,6952],{"class":363,"line":570},[361,6953,5966],{"class":381},[21,6955,6957],{"id":6956},"génération-de-playlist","Génération de playlist",[11,6959,6960,6961,6964,6965,6968,6969,6972,6973,831],{},"Permet de générer une playlist sur un dossier pour utilisation avec le\nlogiciel kpf (par exemple) de KDE. Il parcourt l'ensemble des dossiers\net crée un fichier ",[179,6962,6963],{},"m3u"," à chaque fois qu'il trouve un fichier\nmultimédia. Il remplace le début du dossier par un lien ",[179,6966,6967],{},"http",".Je\nrajoute qu'il existe un très bon site contenant de la musique\n",[2269,6970,6971],{},"libre"," : ",[77,6974,6977],{"href":6975,"rel":6976},"http:\u002F\u002Fwww.jamendo.org\u002Ffr\u002F",[731],"Jamendo",[51,6979,6981],{"className":355,"code":6980,"language":357,"meta":59,"style":59},"#!\u002Fbin\u002Fsh\n\nOLD=`pwd`\n\ncd \"$1\"\nif [ $? -ne 0 ] ; then\n    exit\nfi\n\nTHIS=`pwd`\nBASE=`basename \"$THIS\"`\n\necho \"Ouverture de $BASE\"\n\nfor path in * ; do\n    if [ -d \"$THIS\u002F$path\" ] ; then\n        $0 \"$THIS\u002F$path\"\n    fi\ndone\n\necho \"Traitement de $BASE\"\nrm $BASE.m3u 2> \u002Fdev\u002Fnull\n\nfor path in *.mp3 *.ogg *.wma *.avi ; do\n    echo $path | grep \\* > \u002Fdev\u002Fnull\n    if [ $? -eq 1 ] ; then\n        echo $THIS\u002F$path | sed -e \"s\u002F\\\u002Fmedia\\\u002Fmusic\u002Fhttp\\:\\\u002F\\\u002F192\\.168\\.101\\.7\\:8001\u002Fg\" >> $BASE.m3u\n    fi\ndone\n\necho \"Sortie de $BASE\"\n",[36,6982,6983,6987,6991,7005,7009,7020,7036,7041,7045,7049,7062,7080,7084,7096,7100,7115,7138,7153,7158,7162,7166,7177,7192,7196,7220,7239,7255,7284,7288,7292,7296],{"__ignoreMap":59},[361,6984,6985],{"class":363,"line":364},[361,6986,368],{"class":367},[361,6988,6989],{"class":363,"line":371},[361,6990,375],{"emptyLinePlaceholder":374},[361,6992,6993,6996,6998,7000,7003],{"class":363,"line":378},[361,6994,6995],{"class":518},"OLD",[361,6997,522],{"class":389},[361,6999,525],{"class":406},[361,7001,7002],{"class":389},"pwd",[361,7004,3492],{"class":406},[361,7006,7007],{"class":363,"line":399},[361,7008,375],{"emptyLinePlaceholder":374},[361,7010,7011,7013,7015,7018],{"class":363,"line":416},[361,7012,859],{"class":389},[361,7014,581],{"class":406},[361,7016,7017],{"class":1015},"$1",[361,7019,3408],{"class":406},[361,7021,7022,7024,7026,7028,7030,7032,7034],{"class":363,"line":440},[361,7023,382],{"class":381},[361,7025,386],{"class":385},[361,7027,425],{"class":424},[361,7029,667],{"class":389},[361,7031,432],{"class":431},[361,7033,435],{"class":385},[361,7035,396],{"class":381},[361,7037,7038],{"class":363,"line":458},[361,7039,7040],{"class":389},"    exit\n",[361,7042,7043],{"class":363,"line":464},[361,7044,708],{"class":381},[361,7046,7047],{"class":363,"line":477},[361,7048,375],{"emptyLinePlaceholder":374},[361,7050,7051,7054,7056,7058,7060],{"class":363,"line":489},[361,7052,7053],{"class":518},"THIS",[361,7055,522],{"class":389},[361,7057,525],{"class":406},[361,7059,7002],{"class":389},[361,7061,3492],{"class":406},[361,7063,7064,7067,7069,7071,7073,7075,7078],{"class":363,"line":504},[361,7065,7066],{"class":518},"BASE",[361,7068,522],{"class":389},[361,7070,525],{"class":406},[361,7072,5259],{"class":402},[361,7074,581],{"class":406},[361,7076,7077],{"class":518},"$THIS",[361,7079,6269],{"class":406},[361,7081,7082],{"class":363,"line":509},[361,7083,375],{"emptyLinePlaceholder":374},[361,7085,7086,7088,7091,7094],{"class":363,"line":515},[361,7087,3324],{"class":389},[361,7089,7090],{"class":406}," \"Ouverture de ",[361,7092,7093],{"class":518},"$BASE",[361,7095,3408],{"class":406},[361,7097,7098],{"class":363,"line":542},[361,7099,375],{"emptyLinePlaceholder":374},[361,7101,7102,7104,7107,7109,7111,7113],{"class":363,"line":559},[361,7103,5936],{"class":381},[361,7105,7106],{"class":518}," path",[361,7108,5218],{"class":381},[361,7110,1363],{"class":406},[361,7112,5244],{"class":385},[361,7114,5247],{"class":381},[361,7116,7117,7119,7121,7123,7125,7127,7129,7132,7134,7136],{"class":363,"line":570},[361,7118,1240],{"class":381},[361,7120,386],{"class":385},[361,7122,5192],{"class":389},[361,7124,581],{"class":406},[361,7126,7077],{"class":518},[361,7128,1315],{"class":406},[361,7130,7131],{"class":518},"$path",[361,7133,587],{"class":406},[361,7135,435],{"class":385},[361,7137,396],{"class":381},[361,7139,7140,7143,7145,7147,7149,7151],{"class":363,"line":575},[361,7141,7142],{"class":1015},"        $0",[361,7144,581],{"class":406},[361,7146,7077],{"class":518},[361,7148,1315],{"class":406},[361,7150,7131],{"class":518},[361,7152,3408],{"class":406},[361,7154,7155],{"class":363,"line":596},[361,7156,7157],{"class":381},"    fi\n",[361,7159,7160],{"class":363,"line":627},[361,7161,5966],{"class":381},[361,7163,7164],{"class":363,"line":646},[361,7165,375],{"emptyLinePlaceholder":374},[361,7167,7168,7170,7173,7175],{"class":363,"line":658},[361,7169,3324],{"class":389},[361,7171,7172],{"class":406}," \"Traitement de ",[361,7174,7093],{"class":518},[361,7176,3408],{"class":406},[361,7178,7179,7182,7185,7188,7190],{"class":363,"line":677},[361,7180,7181],{"class":402},"rm",[361,7183,7184],{"class":518}," $BASE",[361,7186,7187],{"class":406},".m3u",[361,7189,410],{"class":385},[361,7191,413],{"class":406},[361,7193,7194],{"class":363,"line":691},[361,7195,375],{"emptyLinePlaceholder":374},[361,7197,7198,7200,7202,7204,7207,7210,7213,7216,7218],{"class":363,"line":700},[361,7199,5936],{"class":381},[361,7201,7106],{"class":518},[361,7203,5218],{"class":381},[361,7205,7206],{"class":406}," *.mp3",[361,7208,7209],{"class":406}," *.ogg",[361,7211,7212],{"class":406}," *.wma",[361,7214,7215],{"class":406}," *.avi",[361,7217,5244],{"class":385},[361,7219,5247],{"class":381},[361,7221,7222,7224,7227,7229,7232,7235,7237],{"class":363,"line":705},[361,7223,5953],{"class":389},[361,7225,7226],{"class":518}," $path",[361,7228,590],{"class":385},[361,7230,7231],{"class":402},"grep",[361,7233,7234],{"class":389}," \\*",[361,7236,4806],{"class":385},[361,7238,413],{"class":406},[361,7240,7241,7243,7245,7247,7249,7251,7253],{"class":363,"line":2064},[361,7242,1240],{"class":381},[361,7244,386],{"class":385},[361,7246,425],{"class":424},[361,7248,5376],{"class":389},[361,7250,1249],{"class":431},[361,7252,435],{"class":385},[361,7254,396],{"class":381},[361,7256,7257,7259,7262,7264,7266,7268,7271,7273,7276,7279,7281],{"class":363,"line":2103},[361,7258,578],{"class":389},[361,7260,7261],{"class":518}," $THIS",[361,7263,1315],{"class":406},[361,7265,7131],{"class":518},[361,7267,590],{"class":385},[361,7269,7270],{"class":402},"sed",[361,7272,6013],{"class":431},[361,7274,7275],{"class":406}," \"s\u002F\\\u002Fmedia\\\u002Fmusic\u002Fhttp\\:\\\u002F\\\u002F192\\.168\\.101\\.7\\:8001\u002Fg\"",[361,7277,7278],{"class":385}," >> ",[361,7280,7093],{"class":518},[361,7282,7283],{"class":406},".m3u\n",[361,7285,7286],{"class":363,"line":2134},[361,7287,7157],{"class":381},[361,7289,7290],{"class":363,"line":2141},[361,7291,5966],{"class":381},[361,7293,7294],{"class":363,"line":2146},[361,7295,375],{"emptyLinePlaceholder":374},[361,7297,7298,7300,7303,7305],{"class":363,"line":3135},[361,7299,3324],{"class":389},[361,7301,7302],{"class":406}," \"Sortie de ",[361,7304,7093],{"class":518},[361,7306,3408],{"class":406},[21,7308,7310],{"id":7309},"script-pour-gérer-les-documents-latex","Script pour gérer les documents latex",[11,7312,7313,7314,7317,7318,7321,7322,831],{},"Ce script date de quelques temps quand je devais générer des documents\ndifférents à partir d'un même document ",[179,7315,7316],{},"LaTeX",".Il utilise différentes\ncommandes pour cela, et permet aussi de nettoyer le dossier. Une sorte\nde ",[179,7319,7320],{},"Makefile"," à la mode ",[179,7323,357],{},[51,7325,7327],{"className":355,"code":7326,"language":357,"meta":59,"style":59},"#!\u002Fbin\u002Fsh\n\nif [ $# != 2 ] ; then\n    echo \"Il faut le nom du fichier et de la sortie\"\n    exit 1;\nfi\n\nNAME=$1\nDEST=$2\n\ncase $DEST in\n    cleanPDF)\n        rm -f $NAME.pdf ;;\n    cleanTXT)\n        rm -f $NAME.txt ;;\n    cleanPS)\n        rm -f $NAME.ps  ;;\n    cleanDVI)\n        rm -f $NAME.dvi ;;\n    cleanHTML)\n        rm -f $NAME.html ;;\n    cleanTEX)\n        rm -f *.log *.toc *.htoc *.aux *.haux *~ ;;\n    clean)\n        glatex.sh $NAME cleanTEX\n        glatex.sh $NAME cleanDVI\n        glatex.sh $NAME cleanPS\n        glatex.sh $NAME cleanTXT\n        glatex.sh $NAME cleanPDF\n        glatex.sh $NAME cleanHTML ;;\n    mrproper)\n        glatex.sh $NAME clean ;;\n    _dvi)\n        pslatex $NAME.tex\n        pslatex $NAME.tex ;;\n    xdvi)\n        glatex.sh $NAME _dvi\n        xdvi $NAME.dvi ;;\n    dvi)\n        glatex.sh $NAME _dvi\n        glatex.sh $NAME cleanTEX ;;\n    _html)\n        hevea -francais -fix -noiso $NAME.tex ;;\n    html)\n        glatex.sh $NAME _html\n        glatex.sh $NAME cleanTEX ;;\n    _txt)\n        hevea -francais -fix -text $NAME.tex ;;\n    txt)\n        glatex.sh $NAME _txt\n        glatex.sh $NAME cleanTEX ;;\n    _ps)\n        glatex.sh $NAME _dvi\n        dvips -Ppdf $NAME.dvi ;;\n    ps)\n        glatex.sh $NAME _ps\n        glatex.sh $NAME cleanDVI\n        glatex.sh $NAME cleanTEX ;;\n    _pdf)\n        pdflatex $NAME.tex\n        pdflatex $NAME.tex ;;\n    pdf)\n        glatex.sh $NAME _pdf\n        glatex.sh $NAME cleanTEX ;;\nesac\n",[36,7328,7329,7333,7337,7354,7361,7370,7374,7378,7386,7396,7400,7410,7417,7433,7440,7453,7460,7474,7481,7494,7501,7514,7521,7559,7566,7576,7585,7594,7603,7612,7623,7630,7641,7648,7658,7669,7676,7685,7696,7703,7711,7722,7729,7749,7756,7765,7775,7782,7799,7806,7815,7825,7832,7840,7854,7861,7870,7878,7888,7895,7904,7914,7921,7930,7940],{"__ignoreMap":59},[361,7330,7331],{"class":363,"line":364},[361,7332,368],{"class":367},[361,7334,7335],{"class":363,"line":371},[361,7336,375],{"emptyLinePlaceholder":374},[361,7338,7339,7341,7343,7345,7347,7350,7352],{"class":363,"line":378},[361,7340,382],{"class":381},[361,7342,386],{"class":385},[361,7344,3352],{"class":424},[361,7346,428],{"class":389},[361,7348,7349],{"class":431}," 2",[361,7351,435],{"class":385},[361,7353,396],{"class":381},[361,7355,7356,7358],{"class":363,"line":399},[361,7357,5953],{"class":389},[361,7359,7360],{"class":406}," \"Il faut le nom du fichier et de la sortie\"\n",[361,7362,7363,7366,7368],{"class":363,"line":416},[361,7364,7365],{"class":389},"    exit",[361,7367,1249],{"class":431},[361,7369,2651],{"class":385},[361,7371,7372],{"class":363,"line":440},[361,7373,708],{"class":381},[361,7375,7376],{"class":363,"line":458},[361,7377,375],{"emptyLinePlaceholder":374},[361,7379,7380,7382,7384],{"class":363,"line":464},[361,7381,5491],{"class":518},[361,7383,522],{"class":389},[361,7385,6092],{"class":1015},[361,7387,7388,7391,7393],{"class":363,"line":477},[361,7389,7390],{"class":518},"DEST",[361,7392,522],{"class":389},[361,7394,7395],{"class":1015},"$2\n",[361,7397,7398],{"class":363,"line":489},[361,7399,375],{"emptyLinePlaceholder":374},[361,7401,7402,7405,7408],{"class":363,"line":504},[361,7403,7404],{"class":381},"case",[361,7406,7407],{"class":518}," $DEST",[361,7409,5548],{"class":381},[361,7411,7412,7415],{"class":363,"line":509},[361,7413,7414],{"class":518},"    cleanPDF",[361,7416,5557],{"class":385},[361,7418,7419,7422,7424,7427,7430],{"class":363,"line":515},[361,7420,7421],{"class":402},"        rm",[361,7423,5056],{"class":431},[361,7425,7426],{"class":518}," $NAME",[361,7428,7429],{"class":406},".pdf",[361,7431,7432],{"class":385}," ;;\n",[361,7434,7435,7438],{"class":363,"line":542},[361,7436,7437],{"class":518},"    cleanTXT",[361,7439,5557],{"class":385},[361,7441,7442,7444,7446,7448,7451],{"class":363,"line":559},[361,7443,7421],{"class":402},[361,7445,5056],{"class":431},[361,7447,7426],{"class":518},[361,7449,7450],{"class":406},".txt",[361,7452,7432],{"class":385},[361,7454,7455,7458],{"class":363,"line":570},[361,7456,7457],{"class":518},"    cleanPS",[361,7459,5557],{"class":385},[361,7461,7462,7464,7466,7468,7471],{"class":363,"line":575},[361,7463,7421],{"class":402},[361,7465,5056],{"class":431},[361,7467,7426],{"class":518},[361,7469,7470],{"class":406},".ps",[361,7472,7473],{"class":385},"  ;;\n",[361,7475,7476,7479],{"class":363,"line":596},[361,7477,7478],{"class":518},"    cleanDVI",[361,7480,5557],{"class":385},[361,7482,7483,7485,7487,7489,7492],{"class":363,"line":627},[361,7484,7421],{"class":402},[361,7486,5056],{"class":431},[361,7488,7426],{"class":518},[361,7490,7491],{"class":406},".dvi",[361,7493,7432],{"class":385},[361,7495,7496,7499],{"class":363,"line":646},[361,7497,7498],{"class":518},"    cleanHTML",[361,7500,5557],{"class":385},[361,7502,7503,7505,7507,7509,7512],{"class":363,"line":658},[361,7504,7421],{"class":402},[361,7506,5056],{"class":431},[361,7508,7426],{"class":518},[361,7510,7511],{"class":406},".html",[361,7513,7432],{"class":385},[361,7515,7516,7519],{"class":363,"line":677},[361,7517,7518],{"class":518},"    cleanTEX",[361,7520,5557],{"class":385},[361,7522,7523,7525,7527,7529,7532,7534,7537,7539,7542,7544,7547,7549,7552,7554,7557],{"class":363,"line":691},[361,7524,7421],{"class":402},[361,7526,5056],{"class":431},[361,7528,1363],{"class":424},[361,7530,7531],{"class":406},".log",[361,7533,1363],{"class":424},[361,7535,7536],{"class":406},".toc",[361,7538,1363],{"class":424},[361,7540,7541],{"class":406},".htoc",[361,7543,1363],{"class":424},[361,7545,7546],{"class":406},".aux",[361,7548,1363],{"class":424},[361,7550,7551],{"class":406},".haux",[361,7553,1363],{"class":424},[361,7555,7556],{"class":406},"~",[361,7558,7432],{"class":385},[361,7560,7561,7564],{"class":363,"line":700},[361,7562,7563],{"class":518},"    clean",[361,7565,5557],{"class":385},[361,7567,7568,7571,7573],{"class":363,"line":705},[361,7569,7570],{"class":402},"        glatex.sh",[361,7572,7426],{"class":518},[361,7574,7575],{"class":406}," cleanTEX\n",[361,7577,7578,7580,7582],{"class":363,"line":2064},[361,7579,7570],{"class":402},[361,7581,7426],{"class":518},[361,7583,7584],{"class":406}," cleanDVI\n",[361,7586,7587,7589,7591],{"class":363,"line":2103},[361,7588,7570],{"class":402},[361,7590,7426],{"class":518},[361,7592,7593],{"class":406}," cleanPS\n",[361,7595,7596,7598,7600],{"class":363,"line":2134},[361,7597,7570],{"class":402},[361,7599,7426],{"class":518},[361,7601,7602],{"class":406}," cleanTXT\n",[361,7604,7605,7607,7609],{"class":363,"line":2141},[361,7606,7570],{"class":402},[361,7608,7426],{"class":518},[361,7610,7611],{"class":406}," cleanPDF\n",[361,7613,7614,7616,7618,7621],{"class":363,"line":2146},[361,7615,7570],{"class":402},[361,7617,7426],{"class":518},[361,7619,7620],{"class":406}," cleanHTML",[361,7622,7432],{"class":385},[361,7624,7625,7628],{"class":363,"line":3135},[361,7626,7627],{"class":518},"    mrproper",[361,7629,5557],{"class":385},[361,7631,7632,7634,7636,7639],{"class":363,"line":3146},[361,7633,7570],{"class":402},[361,7635,7426],{"class":518},[361,7637,7638],{"class":406}," clean",[361,7640,7432],{"class":385},[361,7642,7643,7646],{"class":363,"line":3157},[361,7644,7645],{"class":518},"    _dvi",[361,7647,5557],{"class":385},[361,7649,7650,7653,7655],{"class":363,"line":3168},[361,7651,7652],{"class":402},"        pslatex",[361,7654,7426],{"class":518},[361,7656,7657],{"class":406},".tex\n",[361,7659,7660,7662,7664,7667],{"class":363,"line":3381},[361,7661,7652],{"class":402},[361,7663,7426],{"class":518},[361,7665,7666],{"class":406},".tex",[361,7668,7432],{"class":385},[361,7670,7671,7674],{"class":363,"line":3386},[361,7672,7673],{"class":518},"    xdvi",[361,7675,5557],{"class":385},[361,7677,7678,7680,7682],{"class":363,"line":3392},[361,7679,7570],{"class":402},[361,7681,7426],{"class":518},[361,7683,7684],{"class":406}," _dvi\n",[361,7686,7687,7690,7692,7694],{"class":363,"line":3411},[361,7688,7689],{"class":402},"        xdvi",[361,7691,7426],{"class":518},[361,7693,7491],{"class":406},[361,7695,7432],{"class":385},[361,7697,7698,7701],{"class":363,"line":3428},[361,7699,7700],{"class":518},"    dvi",[361,7702,5557],{"class":385},[361,7704,7705,7707,7709],{"class":363,"line":3445},[361,7706,7570],{"class":402},[361,7708,7426],{"class":518},[361,7710,7684],{"class":406},[361,7712,7713,7715,7717,7720],{"class":363,"line":3462},[361,7714,7570],{"class":402},[361,7716,7426],{"class":518},[361,7718,7719],{"class":406}," cleanTEX",[361,7721,7432],{"class":385},[361,7723,7724,7727],{"class":363,"line":3467},[361,7725,7726],{"class":518},"    _html",[361,7728,5557],{"class":385},[361,7730,7731,7734,7737,7740,7743,7745,7747],{"class":363,"line":3473},[361,7732,7733],{"class":402},"        hevea",[361,7735,7736],{"class":431}," -francais",[361,7738,7739],{"class":431}," -fix",[361,7741,7742],{"class":431}," -noiso",[361,7744,7426],{"class":518},[361,7746,7666],{"class":406},[361,7748,7432],{"class":385},[361,7750,7751,7754],{"class":363,"line":3495},[361,7752,7753],{"class":518},"    html",[361,7755,5557],{"class":385},[361,7757,7758,7760,7762],{"class":363,"line":3514},[361,7759,7570],{"class":402},[361,7761,7426],{"class":518},[361,7763,7764],{"class":406}," _html\n",[361,7766,7767,7769,7771,7773],{"class":363,"line":3533},[361,7768,7570],{"class":402},[361,7770,7426],{"class":518},[361,7772,7719],{"class":406},[361,7774,7432],{"class":385},[361,7776,7777,7780],{"class":363,"line":3552},[361,7778,7779],{"class":518},"    _txt",[361,7781,5557],{"class":385},[361,7783,7784,7786,7788,7790,7793,7795,7797],{"class":363,"line":3557},[361,7785,7733],{"class":402},[361,7787,7736],{"class":431},[361,7789,7739],{"class":431},[361,7791,7792],{"class":431}," -text",[361,7794,7426],{"class":518},[361,7796,7666],{"class":406},[361,7798,7432],{"class":385},[361,7800,7801,7804],{"class":363,"line":3577},[361,7802,7803],{"class":518},"    txt",[361,7805,5557],{"class":385},[361,7807,7808,7810,7812],{"class":363,"line":3585},[361,7809,7570],{"class":402},[361,7811,7426],{"class":518},[361,7813,7814],{"class":406}," _txt\n",[361,7816,7817,7819,7821,7823],{"class":363,"line":3593},[361,7818,7570],{"class":402},[361,7820,7426],{"class":518},[361,7822,7719],{"class":406},[361,7824,7432],{"class":385},[361,7826,7827,7830],{"class":363,"line":3598},[361,7828,7829],{"class":518},"    _ps",[361,7831,5557],{"class":385},[361,7833,7834,7836,7838],{"class":363,"line":3603},[361,7835,7570],{"class":402},[361,7837,7426],{"class":518},[361,7839,7684],{"class":406},[361,7841,7842,7845,7848,7850,7852],{"class":363,"line":3614},[361,7843,7844],{"class":402},"        dvips",[361,7846,7847],{"class":431}," -Ppdf",[361,7849,7426],{"class":518},[361,7851,7491],{"class":406},[361,7853,7432],{"class":385},[361,7855,7856,7859],{"class":363,"line":3630},[361,7857,7858],{"class":518},"    ps",[361,7860,5557],{"class":385},[361,7862,7863,7865,7867],{"class":363,"line":3651},[361,7864,7570],{"class":402},[361,7866,7426],{"class":518},[361,7868,7869],{"class":406}," _ps\n",[361,7871,7872,7874,7876],{"class":363,"line":3656},[361,7873,7570],{"class":402},[361,7875,7426],{"class":518},[361,7877,7584],{"class":406},[361,7879,7880,7882,7884,7886],{"class":363,"line":3662},[361,7881,7570],{"class":402},[361,7883,7426],{"class":518},[361,7885,7719],{"class":406},[361,7887,7432],{"class":385},[361,7889,7890,7893],{"class":363,"line":3668},[361,7891,7892],{"class":518},"    _pdf",[361,7894,5557],{"class":385},[361,7896,7897,7900,7902],{"class":363,"line":3674},[361,7898,7899],{"class":402},"        pdflatex",[361,7901,7426],{"class":518},[361,7903,7657],{"class":406},[361,7905,7906,7908,7910,7912],{"class":363,"line":3680},[361,7907,7899],{"class":402},[361,7909,7426],{"class":518},[361,7911,7666],{"class":406},[361,7913,7432],{"class":385},[361,7915,7916,7919],{"class":363,"line":3685},[361,7917,7918],{"class":518},"    pdf",[361,7920,5557],{"class":385},[361,7922,7923,7925,7927],{"class":363,"line":3691},[361,7924,7570],{"class":402},[361,7926,7426],{"class":518},[361,7928,7929],{"class":406}," _pdf\n",[361,7931,7932,7934,7936,7938],{"class":363,"line":3697},[361,7933,7570],{"class":402},[361,7935,7426],{"class":518},[361,7937,7719],{"class":406},[361,7939,7432],{"class":385},[361,7941,7942],{"class":363,"line":3703},[361,7943,7944],{"class":381},"esac\n",[762,7946,7947],{},"html pre.shiki code .sVyAn, html code.shiki .sVyAn{--shiki-default:#E06C75}html pre.shiki code .sjrmR, html code.shiki .sjrmR{--shiki-default:#56B6C2}html pre.shiki code .subq3, html code.shiki .subq3{--shiki-default:#98C379}html pre.shiki code .sVbv2, html code.shiki .sVbv2{--shiki-default:#61AFEF}html pre.shiki code .sVC51, html code.shiki .sVC51{--shiki-default:#D19A66}html pre.shiki code .sn6KH, html code.shiki .sn6KH{--shiki-default:#ABB2BF}html pre.shiki code .seHd6, html code.shiki .seHd6{--shiki-default:#C678DD}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sV9Aq, html code.shiki .sV9Aq{--shiki-default:#7F848E;--shiki-default-font-style:italic}html pre.shiki code .s_ZVi, html code.shiki .s_ZVi{--shiki-default:#E06C75;--shiki-default-font-style:italic}html pre.shiki code .sU0A5, html code.shiki .sU0A5{--shiki-default:#E5C07B}",{"title":59,"searchDepth":371,"depth":371,"links":7949},[7950,7951,7952,7953,7954,7955,7956,7957],{"id":5879,"depth":378,"text":5880},{"id":5983,"depth":378,"text":5984},{"id":6049,"depth":378,"text":6050},{"id":6380,"depth":378,"text":6381},{"id":6508,"depth":378,"text":6509},{"id":6809,"depth":378,"text":6810},{"id":6956,"depth":378,"text":6957},{"id":7309,"depth":378,"text":7310},"2006-08-20","Ce billet est consacré au script Linux. J'ai écrit divers script pour\n\"automatiser\" certaines commandes, même si je dois exécuter ces\nscripts manuellement. Je pourrais, quand bien même, appeler ces scripts\ndans un cron si je le souhaitais.",{"type":8,"value":7961},[7962,7968],[11,7963,5865,7964,5869,7966,5873],{},[179,7965,5868],{},[36,7967,5872],{},[11,7969,5876],{},{},"\u002Fpost\u002Fscript-linux",{"title":5860,"description":7959},"script-linux","posts\u002FSysAdmin\u002F2006-08-20-script-linux",[794,795],"qYYuAxXiRSKJnYilIVY9b-rBpo_YbAqe2w9ZkHlKm6k",1777582408430]