{"id":903,"date":"2013-10-06T14:39:51","date_gmt":"2013-10-06T12:39:51","guid":{"rendered":"https:\/\/akim.sissaoui.com\/?p=903"},"modified":"2015-09-02T15:48:04","modified_gmt":"2015-09-02T13:48:04","slug":"rsync-une-ligne-pour-mettre-a-jour-uniquement-les-dossiers-existants-sur-la-cible","status":"publish","type":"post","link":"https:\/\/akim.sissaoui.com\/en\/informatique\/rsync-une-ligne-pour-mettre-a-jour-uniquement-les-dossiers-existants-sur-la-cible\/","title":{"rendered":"RSYNC: Une ligne pour mettre \u00e0 jour uniquement les dossiers existants sur la cible"},"content":{"rendered":"<p>Voici la donne:<\/p>\n<p>J&#8217;ai une carte SD sur laquelle j&#8217;ai essay\u00e9 de copier une s\u00e9lection de dossiers musicaux. Casse-t\u00eate des syst\u00e8mes de fichier et des compatibilit\u00e9s des cartes SD 64GB aidant, une grande partie des fichiers n&#8217;a pas \u00e9t\u00e9 copi\u00e9 correctement. J&#8217;ai donc souhait\u00e9 faire un RSYNC uniquement des dossiers existants sur la cible afin de pouvoir refaire plusieurs fois la synchro en cas de probl\u00e8me sans avoir \u00e0 refaire ma s\u00e9lection de dossiers \u00e0 chaque fois. Voici \u00e0 quoi je suis arriv\u00e9:<!--more--><\/p>\n<pre lang=\"bash\">find .\/* -maxdepth 0 -type d -print | cut -b 3- | while read line; do rsync -rtzu --progress \"\/home\/mint\/music\/library\/$line\/\" \"\/media\/mint\/C07E-08DE\/$line\";sleep 5;done<\/pre>\n<p>Comme vous pourrez le voir, je suis utilisateur mint. Je suis en effet sur une live Mint pour l&#8217;instant, car Windows me posait trop de probl\u00e8me pour cette copie.<\/p>\n<p>J&#8217;ai donc:<\/p>\n<ul>\n<li>\/home\/mint\/music qui est un share de librairie musicale de mon NAS fait maison, mont\u00e9 dans ce dossier.<\/li>\n<li>\/media\/mint\/C07E-08DE qui est le point de montage de ma carte SD 64GB format\u00e9e en vFAT<\/li>\n<\/ul>\n<p>L&#8217;objectif est donc de r\u00e9cup\u00e9rer la liste des dossiers existants sur la carte SD, et de faire un RSYNC de ces dossiers, en ne recopiant pas les fichiers qui auraient \u00e9t\u00e9 copi\u00e9s avec succ\u00e8s au pr\u00e9alable, pour gagner ainsi du temps. La ligne est ex\u00e9cut\u00e9e depuis \/media\/mint\/C07E-08DE afin d&#8217;\u00e9viter de s&#8217;emb\u00eater \u00e0 devoir supprimer les sous-dossiers de la liste. En effet, si on faisait la commande depuis le root, find nous retournerait l&#8217;ensemble du chemin. Or ici, \u00e7a ne nous arrange pas. En d\u00e9cortiquant la ligne nous avons donc:<\/p>\n<pre lang=\"bash\">find .\/* -type d -maxdepth 0 -print<\/pre>\n<p>Cette commande va retourner la liste des dossiers contenus sur la carte SD sous la forme<\/p>\n<pre lang=\"text\">.\/\u30c9\u30d3\u30e5\u30c3\u30b7\u30fc\r\n.\/2 Many DJ's\r\n.\/Aaliyah\r\n.\/Aaron Jerome\r\n.\/Adam F\r\n.\/Adiemus\r\n.\/A Filetta\r\n.\/Air\r\n.\/Alanis Morissette\r\n.\/Alicia Keys\r\n.\/Alif Tree\r\n.\/All Saints<\/pre>\n<ul>\n<li>&#8220;-type d&#8221; retourne uniquement les dossiers<\/li>\n<li>&#8220;-maxdepth 0&#8221; ne pr\u00e9sente que le premier dossier trouver et pas les sous dossiers<\/li>\n<li>&#8220;-print&#8221; permet de retourner le r\u00e9sultat \u00e0 l&#8217;\u00e9cran<\/li>\n<\/ul>\n<p>Les deux premiers caract\u00e8res nous posent probl\u00e8mes. J&#8217;utilise donc la commande cut pour les supprimer. Le param\u00e8tre &#8220;-b 3-&#8221; qui implique que l&#8217;on ne retourne que le texte d\u00e8s le 3\u00e8me caract\u00e8re, jusqu&#8217;\u00e0 la fin de la cha\u00eene. R\u00e9sultat:<\/p>\n<pre lang=\"text\">find .\/* -maxdepth 0 -type d -print | cut -b 3-\r\n\r\n\u30c9\u30d3\u30e5\u30c3\u30b7\u30fc\r\n2 Many DJ's\r\nAaliyah\r\nAaron Jerome\r\nAdam F\r\nAdiemus\r\nA Filetta\r\nAir\r\nAlanis Morissette\r\nAlicia Keys\r\nAlif Tree\r\nAll Saints\r\nAmon Tobin\r\nAMOS Tori\r\nAmy Winehouse<\/pre>\n<p>Nous avons donc maintenant une liste de variables que nous allons pouvoir utiliser avec RSYNC. Comme chaque variable est sur une ligne, une boucle for n&#8217;est pas ad\u00e9quate. En effet, par d\u00e9faut &#8220;for&#8221; va lire au km, et consid\u00e9rer chaque espace comme un s\u00e9parateur. Or nous avons ici nombre de dossiers contenant des espaces. C&#8217;est pourquoi j&#8217;utilise la commande read \u00e0 la place. Et comme il y a des espaces, je dois mettre le chemin entre guillemets, sans quoi il s&#8217;arr\u00eatera au premier espace:<\/p>\n<pre lang=\"bash\">find .\/* -maxdepth 0 -type d -print | cut -b 3- | while read line; do rsync -rtzu --progress \"\/home\/mint\/music\/library\/$line\/\" \"\/media\/mint\/C07E-08DE\/$line\";done<\/pre>\n<p>Les param\u00e8tres de la commande rsync sont:<\/p>\n<ul>\n<li>-r : recursive: afin de copier chaque sous-dossiers (des albums en occurrence) de chaque dossier de base (les artistes)<\/li>\n<li>-u : update : Ne copie pas les fichiers qui existent d\u00e9j\u00e0, afin de gagner du temps sur la synchronisation<\/li>\n<li>-t : times : Pr\u00e9serve les dates et heures de chaque fichier<\/li>\n<li>-z : Compress : Permet de gagner du temps durant la copie en utilisant les perfs des procs pour compresser les fichiers durant leur transfert.<\/li>\n<\/ul>\n<p>Nous avons donc maintenant une ligne compl\u00e8te qui ex\u00e9cute les op\u00e9rations suivantes:<\/p>\n<ul>\n<li>Retourne la liste des dossiers<\/li>\n<li>Supprime les deux premiers caract\u00e8res de chaque ligne<\/li>\n<li>Ex\u00e9cute une boucle dans laquelle, lit chaque ligne, et pour chaque ligne, ex\u00e9cute rsync -rtzu<\/li>\n<\/ul>\n<p>J&#8217;ai donc maintenant une commande en une ligne pour synchroniser uniquement les dossiers qui existaient d\u00e9j\u00e0 sur ma carte SD cible.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Voici la donne: J&#8217;ai une carte SD sur laquelle j&#8217;ai essay\u00e9 de copier une s\u00e9lection de dossiers musicaux. Casse-t\u00eate des syst\u00e8mes de fichier et des compatibilit\u00e9s des cartes SD 64GB aidant, une grande partie des fichiers n&#8217;a pas \u00e9t\u00e9 copi\u00e9 correctement. J&#8217;ai donc souhait\u00e9 faire un RSYNC uniquement des dossiers existants sur la cible afin [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[220],"tags":[202,63,56,201],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/akim.sissaoui.com\/en\/wp-json\/wp\/v2\/posts\/903"}],"collection":[{"href":"https:\/\/akim.sissaoui.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/akim.sissaoui.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/akim.sissaoui.com\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/akim.sissaoui.com\/en\/wp-json\/wp\/v2\/comments?post=903"}],"version-history":[{"count":7,"href":"https:\/\/akim.sissaoui.com\/en\/wp-json\/wp\/v2\/posts\/903\/revisions"}],"predecessor-version":[{"id":961,"href":"https:\/\/akim.sissaoui.com\/en\/wp-json\/wp\/v2\/posts\/903\/revisions\/961"}],"wp:attachment":[{"href":"https:\/\/akim.sissaoui.com\/en\/wp-json\/wp\/v2\/media?parent=903"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/akim.sissaoui.com\/en\/wp-json\/wp\/v2\/categories?post=903"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/akim.sissaoui.com\/en\/wp-json\/wp\/v2\/tags?post=903"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}