<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>RapazP Home Page</title>
	<atom:link href="http://www.rapazp.ch/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.rapazp.ch</link>
	<description>«Using GNU/Linux isn&#039;t a matter of choice. It&#039;s a matter of freedom!»</description>
	<lastBuildDate>Thu, 26 Aug 2010 05:10:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Désactivation de l&#8217;IPv6 avec Ubuntu 10.04 Lucid Lynx</title>
		<link>http://www.rapazp.ch/?p=417</link>
		<comments>http://www.rapazp.ch/?p=417#comments</comments>
		<pubDate>Mon, 09 Aug 2010 15:36:22 +0000</pubDate>
		<dc:creator>pascal.rapaz</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Shell]]></category>

		<guid isPermaLink="false">http://www.rapazp.ch/?p=417</guid>
		<description><![CDATA[Accélérer sa connexion internet en désactivant l'<code>IPv6</code>]]></description>
			<content:encoded><![CDATA[<h2 id="toc">Table des matières</h2>
<ol>
<li><a href="#intro">Introduction</a>
<li><a href="#check">Vérification de l&#8217;état</a>
<li><a href="#disable">Désactivation</a>
<li><a href="#sources">Sources</a>
</ol>
<h2 id="intro">Introduction</h2>
<p>Dans certains cas la désactivation de l&#8217;<code>IPv6</code> permet d&#8217;accélérer les connexions Internet. Ceci est lié au fait que bon nombre d&#8217;applications essayent d&#8217;abord de trouver l&#8217;adresse IP en passant par l&#8217;<code>IPv6</code> puis, en cas d&#8217;échec, retentent l&#8217;opération en utilisant l&#8217;<code>IPv4</code>. (cf. <a href="http://goo.gl/Yj9w">Désactiver IPv6 permet d&#8217;accélérer les connexions Internet (fr)</a> pour une explication détaillée)</p>
<h2 id="check">Vérification de l&#8217;état</h2>
<p>Avant d&#8217;effectuer quelque modification que ce soit, il peut être intéressant de vérifier l&#8217;état de l&#8217;<code>IPv6</code>.</p>
<p>La commande qui suit retourne <code>0</code> si le protocol est activé et <code>1</code> s&#8217;il ne l&#8217;est pas:</p>
<pre><code>$ cat /proc/sys/net/ipv6/conf/all/disable_ipv6</code></pre>
<h2 id="disable">Désactivation du protocol</h2>
<p>Dans le cas où la commande précédente retourne <code>0</code>, il suffit d&#8217;exécuter la commande qui suit afin d&#8217;ajouter quelques lignes au fichier de configuration <code>/etc/sysctl.conf</code>. Après redémarrage le support de l&#8217;<code>IPv6</code> sera désactivé.</p>
<pre><code>$ echo "
#disable ipv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1" | sudo tee -a /etc/sysctl.conf</code></pre>
<h2 id="sources">Sources</h2>
<blockquote><ul>
<li><a href="http://goo.gl/lEy9">How To Disable IPv6 In Ubuntu 10.04 Lucid Lynx (en)</a></li>
<li><a href="http://goo.gl/Yj9w">Désactiver IPv6 permet d&#8217;accélérer les connexions internet (fr)</a></li>
</ul>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.rapazp.ch/?feed=rss2&amp;p=417</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Canaux et redirections</title>
		<link>http://www.rapazp.ch/?p=249</link>
		<comments>http://www.rapazp.ch/?p=249#comments</comments>
		<pubDate>Sun, 13 Jun 2010 21:19:32 +0000</pubDate>
		<dc:creator>pascal.rapaz</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Shell]]></category>

		<guid isPermaLink="false">http://www.rapazp.ch/?p=249</guid>
		<description><![CDATA[Présentation de quelques techniques pour rediriger les flux I/O (entrées/sorties) sous GNU/Linux]]></description>
			<content:encoded><![CDATA[<h2 id="toc">Table des matières</h2>
<ol>
<li><a href="#principes">Principes</a>
<li><a href="#redirections">Redirections</a>
<ol style="font-size: 0.8em;">
<li><a href="#stdout">Sortie standard: <code>sdtout</code></a>
<li><a href="#stderr">Sortie d&#8217;erreur standard: <code>sdterr</code></a>
<li><a href="#stdin">Entrée standard: <code>sdtin</code></a>
<li><a href="#pipe">Le Pipe</a>
      </ol>
<li><a href="#canaux">Canaux</a>
<ol style="font-size: 0.8em;">
<li><a href="#channel">Création de canaux</a>
<li><a href="#combine">Redirection de canaux</a>
      </ol>
<li><a href="#device">Device <code>/dev/null</code></a>
<li><a href="#shell">Script <code>shell</code></a>
<li><a href="#samples">Exemples</a>
<li><a href="#sources">Sources</a>
</ol>
<h2 id="principes">Principes</h2>
<p>L&#8217;exécution d&#8217;une commande <code>shell</code> va créer un processus qui ouvrira trois flux correspondants à trois canaux (ou file descriptors):</p>
<blockquote><ul>
<li>Le canal <code>0</code> est l&#8217;entrée standard <code>stdin</code> dans lequel le processus va lire les données.<br />
Par défaut <code>stdin</code> correspond au clavier.</li>
<li>Le canal <code>1</code> est la sortie standard <code>stdout</code> dans lequel le processus va écrire les données.<br />
Par défaut <code>stdout</code> correspond à l&#8217;écran.</li>
<li>Le canal <code>2</code> est la sortie d&#8217;erreur standard <code>stderr</code> dans lequel le processus va écrire les messages d&#8217;erreur.<br />
Par défaut <code>stderr</code> correspond à l&#8217;écran.</li>
</ul>
</blockquote>
<p>Il est possible de modifier le fonctionnement par défaut et de rediriger les différents flux d&#8217;entrées/sorties afin que le processus interagisse avec un autre flux.</p>
<p>En outre, en plus des trois canaux par défaut, sept autres canaux, numérotés de 3 à 9, peuvent être ouvert en entrée ou en sortie selon les besoins. Ce qui ramène le nombre total de canaux utilisables simultanément et en parallèle à dix.</p>
<h2 id="redirections">Redirections</h2>
<h3 id="stdout">Sortie standard: <code>sdtout</code></h3>
<p>L&#8217;opérateur de redirection <code>&gt;</code> redirige la sortie standard <code>stdout</code> (canal <code>1</code>), qui est l&#8217;écran par défaut, vers un fichier. Si ce dernier n&#8217;existe pas un nouveau fichier est alors créé, sinon il est écrasé.</p>
<p>Ceci peut être gênant dans le cas où le contenu du fichier doit être conservé. Dans cette situation, l&#8217;utilisation de l&#8217;opérateur de redirection <code>&gt;&gt;</code> est privilégié. Avec cet opérateur, si le fichier n&#8217;existe pas un nouveau est créé, sinon les données sont ajoutées à la fin du fichier.</p>
<pre><strong>Syntaxe:</strong>
<code>command &gt; /path/to/some/file</code>
<code>command &gt;&gt; /path/to/some/file</code>
</pre>
<blockquote style="font-style: normal;"><ul>
<li><code>&gt;</code> ou <code>1&gt;</code> redirige la sortie standard <code>stdout</code> dans le fichier <code>list.txt</code>
<pre><code>$ ls &gt; list.txt
ou
$ ls 1&gt; list.txt</code></pre>
</li>
<li><code>&gt;&gt;</code> ou <code>1&gt;&gt;</code> redirige la sortie standard <code>stdout</code> en mode ajout dans le fichier <code>list.txt</code>
<pre><code>$ ls &gt;&gt; list.txt
ou
$ ls 1&gt;&gt; list.txt</code></pre>
</li>
</ul>
</blockquote>
<h3 id="stderr">Sortie d&#8217;erreur standard: <code>sdterr</code></h3>
<p>La redirection de la sortie d&#8217;erreur standard <code>stderr</code> (canal <code>2</code>) est régie par les mêmes règles que la redirection de la <a href="#stdout">sortie standard <code>stdout</code></a> à la différence que le numéro de canal doit être mentionné avant l&#8217;opérateur de redirection <code>&gt;</code> ou <code>&gt;&gt;</code>.</p>
<pre><strong>Syntaxe:</strong>
<code>command 2&gt; /path/to/some/file</code>
<code>command 2&gt;&gt; /path/to/some/file</code>
</pre>
<blockquote style="font-style: normal;"><ul>
<li><code>2&gt;</code> redirige la sortie d&#8217;erreur <code>stderr</code> dans le fichier <code>error.log</code>
<pre><code>$ bad_command 2&gt; error.log</code></pre>
</li>
<li><code>2&gt;&gt;</code> redirige la sortie d&#8217;erreur <code>stderr</code> en mode ajout dans le fichier <code>error.log</code>
<pre><code>$ bad_command 2&gt;&gt; error.log</code></pre>
</li>
</ul>
</blockquote>
<h3 id="stdin">Entrée standard: <code>sdtin</code></h3>
<p>La redirection de l&#8217;entrée standard <code>stdin</code> (canal <code>0</code>), par défaut le clavier, est moins courante que la redirection des sorties. Néanmoins, utilisée à bon escient, elle peut être d&#8217;une grande utilité. Pour interagir avec les flux d&#8217;entrée, deux oprateurs sont disponibles.</p>
<p>L&#8217;opérateur <code>&lt;</code> permet d&#8217;utiliser des données provenant d&#8217;un fichier au lieu du clavier.</p>
<p>L&#8217;opérateur <code>&lt;&lt; token</code>, également appelé <code>heredoc</code>, lit l&#8217;entrée standard jusqu&#8217;à la première occurence de mot clef <code>"token"</code>. Par défaut, les variables et commandes entre <code>backticks</code> (<code>`</code>) sont évaluées et les caractères spéciaux devront être verrouillés par des <code>backslash</code> (<code>\</code>). Ceci peut-être évité en mettant le mot clef de l&#8217;opérateur entre apostrophes (<code>'</code>) ou entre guillemets (<code>"</code>).</p>
<pre><strong>Syntaxe:</strong>
<code>command &lt; /path/to/some/file</code>
<code>command &lt;&lt; token Contenu a rediriger token</code>
<code>command &lt;&lt; "token" Contenu a rediriger token</code>
</pre>
<blockquote style="font-style: normal;"><ul>
<li><code>&lt;</code> redirige le fichier <code>inputFile.txt</code> dans l&#8217;entrée standard <code>stdin</code>
<pre><code>$ cat &lt; inputFile.txt</code></pre>
</li>
<li><code>&lt;&lt; EOF</code> lit l&#8217;entrée standard jusqu&#8217;à la deuxième occurence du mot clef <code>EOF</code> et redirige le contenu dans l&#8217;entrée standard <code>stdin</code>
<pre><code>$ cat &lt;&lt; EOF
&gt; Line 1 sans verrou sur le $dollars
&gt; Line 2 avec verrou sur le \$dollars
&gt; Line 3 repertoire courant $PWD
&gt; EOF
Line 1 sans verrou sur le
Line 2 avec verrou sur le $dollars
Line 3 repertoire courant /home/user
$</code></pre>
</li>
<li><code>&lt;&lt; "EOF"</code> lit l&#8217;entrée standard jusqu&#8217;à la deuxième occurence du mot clef <code>EOF</code> et redirige le contenu dans l&#8217;entrée standard <code>stdin</code> <em style="font-style: italic;">sans interpréter les variables</em>
<pre><code>$ cat &lt;&lt; "EOF"
&gt; Line 1 sans verrou sur le $dollars
&gt; Line 2 avec verrou sur le \$dollars
&gt; Line 3 repertoire courant $PWD
&gt; EOF
Line 1 sans verrou sur le $dollars
Line 2 avec verrou sur le \$dollars
Line 3 repertoire courant $PWD
$</code></pre>
</li>
</ul>
</blockquote>
<h3 id="pipe">Le Pipe</h3>
<p>La redirection entre processus avec le <code>pipe</code> (<code>|</code>) permet de créer des &#8220;pipelines&#8221;, c&#8217;est à dire qu&#8217;une ligne de commande est constituée d&#8217;une succession de commandes dont la sortie de chacune est redirigée dans l&#8217;entrée de la suivante.</p>
<p>Contrairement aux autres opérateurs de redirection, le <code>pipe</code> ne passe pas par un fichier mais utilise une mémoire tampon (<code>buffer</code>)</p>
<pre><strong>Syntaxe:</strong>
<code>command_1 | command_2</code>
<code>command_1 | command_2 | command_3 | ... | command_N</code>
</pre>
<blockquote style="font-style: normal;"><ul>
<li>Redirige la sortie standard <code>stdout</code> de la commande <code>ls</code> dans l&#8217;entrée standard <code>stdin</code> de la commande <code>less</code>
<pre><code>$ ls | less</code></pre>
</li>
<li>Liste les fichiers de répertoire courant, les trie par ordre décroissant (du plus gros au plus petit) puis affiche les 5 premier résultats
<pre><code>$ ls -al | sort -r -n -k 5 | head -5</code></pre>
</li>
</ul>
</blockquote>
<h2 id="canaux">Canaux</h2>
<h3 id="channel">Création de canaux</h3>
<p>En plus des trois canaux standard, sept autres canaux, numérotés de 3 à 9, peuvent être créés en entrée ou en sortie. La commande <code>exec</code> permet d&#8217;affecter un canal jusqu&#8217;à sa fermeture (<code>exec num_canal&lt;&amp;-</code>).</p>
<pre><strong>Syntaxe:</strong>
<code>exec num_canal&gt; fichier</code>
<code>exec num_canal&lt; fichier</code>
<code>exec num_canal&lt;&amp;-</code></pre>
<blockquote style="font-style: normal;"><ul>
<li>Affecte au canal <code>3</code> le fichier d&#8217;entrée <code>input.txt</code>. Les commandes pourront dès lors utiliser ce canal comme entrée standard <code>stdin</code>
<pre><code>$ exec 3&lt; input.txt</code></pre>
</li>
<li>Affecte au canal <code>4</code> le fichier de sortie <code>file.txt</code>. Dorénavant toute écriture dans le fichier <code>file.txt</code> pourra ce faire par le biais de ce canal
<pre><code>$ exec 4&gt; file.txt</code></pre>
</li>
<li>Redirige la sortie standard <code>stdout</code> vers le canal <code>4</code>, soit finalement vers le fichier <code>file.txt</code>
<pre><code>$ ls &gt;&amp;4
ou
$ ls 1&gt;&amp;4</code></pre>
</li>
<li>Libère le canal <code>4</code>
<pre><code>$ exec 4&lt;&amp;-</code></pre>
</li>
</ul>
</blockquote>
<h3 id="combine">Redirection de canaux</h3>
<p>On peut envisager, dans le cadre de certains traitements, de rediriger un canal dans un autre. Cela permet de regrouper des informations provenant de plusieurs flux distincts dans un seul et unique flux.</p>
<blockquote style="font-style: normal;"><ul>
<li><code>&amp;&gt;</code> redirige la sortie standard <code>stdout</code> ainsi que la sortie d&#8217;erreur standard <code>stderr</code> dans le fichier <code>execution.log</code>
<pre><code>$ not_so_bad_command &amp;&gt; execution.log</code></pre>
</li>
<li><code>&gt;&amp;2</code> redirige la sortie standard <code>stdout</code> vers la sortie d&#8217;erreur standard <code>stderr</code>
<pre><code>$ ls &gt;&amp;2</code></pre>
</li>
<li><code>n&amp;&gt;m</code> redirige tout ce qui est écrit sur le canal <code>n</code> vers le canal <code>m</code>. De ce fait, <code>2&amp;&gt;1</code> redirige la sortie d&#8217;erreur standard <code>stderr</code> vers la sortie standard <code>stdout</code>
<pre><code>$ bad_command 2&gt;&amp;1</code></pre>
</li>
<li><code>&gt;</code> crée le fichier <code>list.txt</code> à l&#8217;intérieur duquel sera inscrit le résultat de la redirection de la sortie d&#8217;erreur standard <code>stderr</code> vers la sortie standard <code>stdout</code>
<pre><code>$ ls &gt; list.txt 2&gt;&amp;1</code></pre>
<table class="admonition">
<tr>
<td><img src="./images/icons/note.png" alt="Note" /></td>
<td>
<p><b>L’ordre d’utilisation des redirections est important.</b></p>
<p>La commande suivante ajoute &#8220;Bonjour&#8221; au fichier <code>hello.txt</code></p>
<pre><code>$ echo "Bonjour" 2&gt; hello.txt 1>&#038;2</code></pre>
<p>alors que la commande suivante affiche &#8220;Bonjour&#8221; sur <code>stdout</code>.</p>
<pre><code>$ echo "Bonjour" 1&gt;&amp;2 2&gt; hello.txt</code></pre>
</td>
</tr>
</table>
</li>
<li><code>5&amp;&lt;0</code> crée le canal <code>5</code> qui est une copie du canal <code>0</code> (<code>stdin</code>)
<pre><code>$ exec 5&amp;&lt;0</code></pre>
</li>
</ul>
</blockquote>
<h2 id="device">Device /dev/null</h2>
<p><code>/dev/null</code> est un périphérique (device) spécial qui rejette toutes les données qui lui sont transmises. Toute redirection de données dans ce périphérique ne seront pas affichées à l&#8217;écran et seront définitivement perdues. Pour cette raison, il est souvent appelé &#8220;trou noir&#8221;.</p>
<pre><strong>Syntaxe:</strong>
<code>command > /dev/null</code>
</pre>
<blockquote style="font-style: normal;"><ul>
<li>Redirige l&#8217;entrée standard <code>stdout</code> dans <code>/dev/null</code>
<pre><code>$ cat file.txt &gt; /dev/null</code></pre>
</li>
<li>Redirige l&#8217;erreur standard <code>stderr</code> dans <code>/dev/null</code>
<pre><code>$ cat file.txt 2&gt; /dev/null</code></pre>
</li>
<li>Redirige l&#8217;erreur standard <code>stderr</code> dans la sortie standard <code>stdout</code> puis redirige cette sortie combinée dans <code>/dev/null</code>
<pre><code>$ cat file.txt &gt; /dev/null 2&gt;&amp;1</code></pre>
</li>
</ul>
</blockquote>
<h2 id="shell">Script shell</h2>
<p>Dans un script <code>shell</code>, il est également possible de rediriger les sorties dans un fichier par le truchement de la commande <code>exec</code>.</p>
<p>L&#8217;exemple qui suit illustre l&#8217;utilisation d&#8217;un script pour rediriger tous les flux dans le fichier <code>/home/user/logs/execution_[date].log</code></p>
<pre><code>#!/bin/bash
# Redirecting stdin and stdout using 'exec'

dest=/home/user/logs
fname=`date +execution_%d%m%Y_%H%M.log`

exec 1&gt;$dest/$fname 2&gt;&#038;1

# search all occurences of 'Sample' in '.txt' files
find -name '*.txt' | xargs grep 'Sample'</code></pre>
<h2 id="samples">Exemples</h2>
<ul>
<li>Récupération et analyse des logs générés lors d&#8217;un <em>update cvs</em> en ridirigeant le <code>sdterr</code> vers le <code>sdtin</code>
<pre><code>$ cvs up 2>&#038;1 | grep --color '^U\|^P\|^A\|^R\|^M\|^C\|^?'</code></pre>
</li>
<li>Effectue un <em>update cvs</em> et ridirige le flux <code>sdterr</code> dans <code>/dev/null</code>. Ici, l&#8217;exécution de la commande <code>grep</code> n&#8217;est utile que pour colorer le résultat. Ce dernier sera d&#8217;ailleurs identique à l&#8217;exemple précédent.
<pre><code>$ cvs up 2> /dev/null | grep --color '^U\|^P\|^A\|^R\|^M\|^C\|^?'</code></pre>
</li>
<li>Suppression de fichiers dans une archive
<pre><code>$ find -type f -printf "zip -d %p META-INF/BadKey.DSA META-INF/BadKey.SF\n" | bash</code></pre>
</li>
</ul>
<h2 id="sources">Sources</h2>
<blockquote><ul>
<li><a href="http://goo.gl/WFNO">Redirection des entrées/sorties (fr)</a></li>
<li><a href="http://goo.gl/y7WM">Des Zéros et des Nulls (fr)</a></li>
<li><a href="http://goo.gl/yeXJ">Advanced Bash-Scripting Guide (en)</a></li>
<li><a href="http://goo.gl/Iahk">Input/Output Redirection in Unix (en)</a></li>
<li><a href="http://goo.gl/Zgsh">The best tips &#038; tricks for bash, explained (en)</a></li>
</ul>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.rapazp.ch/?feed=rss2&amp;p=249</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Reprise d&#8217;une copie avec scp</title>
		<link>http://www.rapazp.ch/?p=352</link>
		<comments>http://www.rapazp.ch/?p=352#comments</comments>
		<pubDate>Tue, 08 Jun 2010 15:41:03 +0000</pubDate>
		<dc:creator>pascal.rapaz</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Shell]]></category>

		<guid isPermaLink="false">http://www.rapazp.ch/?p=352</guid>
		<description><![CDATA[Utilisation dela commande <code>rsync</code> pour copier des fichier de manière sécurisée avec possibilité de reprise en cas d'interruption.]]></description>
			<content:encoded><![CDATA[<p>La commande <code>scp</code> (<code>secure copy</code>) permet de copier de manière sécurisée (via <code>ssh</code>) des fichiers sur des ordinateurs distants. Bien que très pratique, cette dernière ne permet pas la reprise d&#8217;une copie après une interruption du téléchargement.</p>
<p>Ceci est plutôt déplaisant lorsque vous transférer de gros fichiers. Néanmoins il existe une solution: la commande <code>rsync</code>.</p>
<p>Prenons l&#8217;exemple d&#8217;une copie d&#8217;un fichier de mon poste sur un ordinateur distant. Dans ce cas, j&#8217;utiliserai la syntaxe suivante:</p>
<pre><strong>Syntaxe:</strong>
<code>scp [source] [user]@[host]:[destination]</code></pre>
<pre><strong>Exemple:</strong>
<code>$ scp monTexte.txt toto@hostName:/tmp/</code></pre>
<p>En cas de coupure de téléchargement, je vais reprendre le transfert avec la commande ci-dessous.</p>
<pre><strong>Syntaxe:</strong>
<code>rsync --partial --progress --rsh=ssh [source] [user]@[host]:[destination]</code></pre>
<pre><strong>Exemple:</strong>
<code>$ rsync --partial --progress --rsh=ssh monTexte.txt toto@hostName:/tmp/</code></pre>
<p>Les options utilisées sont les suivantes::</p>
<table>
<col style="width: 15%;"/>
<col style="width: 85%;" />
<tr>
<td style="vertical-align: top;"><code>--partial</code></td>
<td style="vertical-align: top;">Permet de relancer le téléchargement depuis le point d&#8217;arrêt</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>--progress</code></td>
<td style="vertical-align: top;">Affiche la progression du transfert</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>--rsh=ssh</code></td>
<td style="vertical-align: top;">Permet de sécuriser le transfert</td>
</tr>
</table>
<table class="admonition">
<tr>
<td class="icon"><img src="../../images/icons/tip.png" alt="Tip"/></td>
<td>
<p>Afin d&#8217;éviter une saisie régulière de l&#8217;intégralité de cette commande, vous pouvez ajouter l&#8217;<code>alias</code> ci-après dans le fichier <code>.bashrc</code> de votre profile (<code>'~/.bashrc'</code>).</p>
<pre><strong>Exemple:</strong>
<code>alias scpresume="rsync --partial --progress --rsh=ssh"</code></pre>
<p>Ainsi la commande <code>scpresume</code> fonctionnera comme la commande <code>scp</code>.</p>
</td>
</tr>
</table>
<h2 id="sources">Sources</h2>
<blockquote><ul>
<li><a href="http://goo.gl/ooTf">Tip: scp Resume (en)</a></li>
</ul>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.rapazp.ch/?feed=rss2&amp;p=352</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Manipulation de fichiers</title>
		<link>http://www.rapazp.ch/?p=340</link>
		<comments>http://www.rapazp.ch/?p=340#comments</comments>
		<pubDate>Tue, 08 Jun 2010 05:08:53 +0000</pubDate>
		<dc:creator>pascal.rapaz</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Shell]]></category>

		<guid isPermaLink="false">http://www.rapazp.ch/?p=340</guid>
		<description><![CDATA[Quelques astuces pour la manipulation de fichiers en console de commande.]]></description>
			<content:encoded><![CDATA[<h2 id="toc">Table des matières</h2>
<ol>
<li><a href="#compression">Compression</a>
<li><a href="#encoding">Changement d&#8217;encodage</a>
<li><a href="#replacement">Remplacement d&#8217;une chaîne</a>
<ol style="font-size: 0.8em;">
<li><a href="#cvs">Changement de CVS</a>
<li><a href="#carriage">Changement du carriage return</a>
        </ol>
</ol>
<h2 id="compression">Compression</h2>
<p>Il peut être intéressant parfois de ne prendre un compte que certains fichiers lors de la création d&#8217;une archive <code>zip</code>.</p>
<p>La commande suivante permet de créer un fichier <code>.zip</code> (nommé <code>sources.zip</code>) contenant tous les fichiers ayant l&#8217;extension <code>.java</code> de manière récursive à partir du répertoire courant.</p>
<pre><code>$ zip -r sources.zip . -i *.java</code></pre>
<h2 id="encoding">Changement d&#8217;encodage</h2>
<p>Certains OS utilisent par défaut l&#8217;encodage de fichier <code>UTF-8</code> (cas de <code>GNU/linux</code>) alors que d&#8217;autres utilisent l&#8217;encodage <code>ISO-8859-1</code> (également appelée <code>Latin-1</code>). Cet encodage différent des caractères pose parfois des problèmes lorsque l&#8217;on souhaite réutiliser des fichiers créés sous un autre système.</p>
<p>Pour continuer à manipuler ces fichiers, deux commandes peuvent être utiles: <code>file</code> et <code>iconv</code>.</p>
<div>
<ul>
<li>La première permet de vérifier l&#8217;encodage:<br />
<blockquote style="font-style: normal;">
<pre><strong>Syntaxe:</strong>
<code>file [file_name]</code></pre>
<pre><strong>Exemple:</strong>
<code>$ file liste.txt
liste.txt: UTF-8 Unicode HTML document text, with CRLF line terminators</code></pre>
</blockquote>
</li>
<li>La seconde permet de convertir l&#8217;encodage:<br />
<blockquote style="font-style: normal;">
<pre><strong>Syntaxe:</strong>
<code>iconv -f [encoding] -t [encoding] &lt; [source] &gt; [destination]</code></pre>
<pre><strong>Exemple:</strong>
<code>$ iconv -f ISO-8859-1 -t UTF-8 &lt; [source] &gt; [destination]
ou
$ iconv --from-code=UTF-8 --to-code=ISO-8859-1 &lt; [source] &gt; [destination]</code></pre>
</blockquote>
</li>
</ul>
</div>
<table class="admonition">
<tr>
<td><img src="./images/icons/note.png" alt="Note"/></td>
<td>
<p>Pour convertir l&#8217;encodage d&#8217;un fichier provenant d&#8217;un iSeries (encodage <code>EBCDIC</code>), il faut utiliser le jeu de caractères <code>IBM-1047</code>.</p>
<p>Pour ce genre de fichiers, il est également possible de les convertir à la volée ainsi le contenu de ce dernier sera affiché dans la console. Si vous désirez les éditer par la suite, il faudra rediriger la sortie dans un fichier.</p>
<pre><code>$ cat &lt;fichier_ebcdic&gt; | dd conv=ascii      # ebcdic vers ascii
ou
$ cat &lt;fichier_ascii&gt; | dd conv=ebcdic      # ascii vers ebcdic</code></pre>
</td>
</tr>
</table>
<table class="admonition">
<tr>
<td><img src="./images/icons/warning.png" alt="Warning"/></td>
<td>N&#8217;utilisez pas le même nom pour la source et la destination au risque de perdre votre fichier!</td>
</tr>
</table>
<h2 id="replacement">Remplacement d&#8217;une chaîne</h2>
<p>Cette commande remplace toutes les occurences de la chaîne de caractères recherchée dans le fichier par une nouvelle chaîne.</p>
<pre><strong>Syntaxe:</strong>
<code>perl -pi -e 's/[old_string]/[new_string]/g;' [file_name]</code></pre>
<pre><strong>Exemple:</strong>
<code>$ perl -pi -e 's/hello/goodbye/g;' monTexte.txt</code></pre>
<p>Une autre solution consiste à utiliser l&#8217;éditeur non interactif <code>sed</code>. Cet éditeur permet d&#8217;appliquer un certain nombres de commandes sur un fichier puis d&#8217;en afficher le résultat sur la sortie standard. Le fichier d&#8217;origine n&#8217;est de ce fait pas modifié.</p>
<pre><strong>Syntaxe:</strong>
<code>sed 's/[old_string]/[new_string]/g;' [file_name]</code></pre>
<pre><strong>Exemple:</strong>
<code>$ sed 's/hello/goodbye/g;' monTexte.txt</code></pre>
<p>Il est néanmoins possible de modifier le contenu du fichier d&#8217;origine en ajoutant l&#8217;option <code>-i</code>.</p>
<p>La commande ci-après recherche toutes les lignes contenant le mot <code>nombre</code> puis remplace le mot <code>hello</code> par <code>goodbye</code> si ce dernier est présent sur la ligne.</p>
<pre><strong>Exemple:</strong>
<code>$ sed -i '/nombre/ s/hello/goodbye/g;' monTexte.txt</code></pre>
<h3 id="cvs">Changement de CVS</h3>
<p>La commande ci-dessous permet de changer le serveur cvs d&#8217;un projet.</p>
<pre><strong>Syntaxe:</strong>
<code>find -name Root | xargs perl -pi -e 's/[old_string]/[new_string]/g'; \
find -name Root.bak | xargs rm</code></pre>
<h3 id="carriage">Changement du carriage return</h3>
<p><code>GNU\Linux</code> et <code>Windows</code> n&#8217;encode malheureusement pas les fins de ligne de la même manière.</p>
<p>La commande suivante liste tous les fichiers (<code>-type f</code>) du répertoire courant (<code>-maxdepth 1</code>) et remplace tous les caractères de fin de ligne; <code>\r\n</code> (<code>Windows</code>) par <code>\n</code> (<code>GNU\Linux</code>).</p>
<pre><strong>Syntaxe:</strong>
<code>find . -maxdepth 1 -type f | xargs perl -pi -e 's/\r\n/\n/g'; ls *.bak | xargs rm</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.rapazp.ch/?feed=rss2&amp;p=340</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Exécuter un programme dans une autre langue</title>
		<link>http://www.rapazp.ch/?p=298</link>
		<comments>http://www.rapazp.ch/?p=298#comments</comments>
		<pubDate>Mon, 31 May 2010 05:11:49 +0000</pubDate>
		<dc:creator>pascal.rapaz</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Gnome]]></category>
		<category><![CDATA[Shell]]></category>

		<guid isPermaLink="false">http://www.rapazp.ch/?p=298</guid>
		<description><![CDATA[Procédure pour exécuter une application dans une langue différente de celle choisie dans les paramètres régionaux de <code>GNOME</code>.]]></description>
			<content:encoded><![CDATA[<h2 id="toc">Table des matières</h2>
<ol>
<li><a href="#idx">Préambule</a>
<li><a href="#appli">Paramètres régionaux pour une application</a>
<li><a href="#man">Paramètres régionaux des manpages</a>
</ol>
<h2 id="idx">Préambule</h2>
<p>Habitué à travailler avec un système d&#8217;exploitation en anglais, il m&#8217;arrive parfois d&#8217;avoir besoin de démarrer une application ou de consulter des fichiers d&#8217;aide en français.</p>
<p>Ceci peut généralement ce faire de manière très simple pour autant que les outils requis soient installés.</p>
<p>En ce qui me concerne, je définis au niveau de l&#8217;application <code>gnome-language-selector</code> (menu <code>Système &gt; Administration &gt; Prise en charge de langues</code>) la liste des langues que je désire utiliser ainsi que les paramètres globaux de prise en charge.</p>
<p>Ensuite, dans un terminal, j&#8217;affiche la liste des paramètres régionaux installés:</p>
<blockquote style="font-style: normal;"><pre><code>$ locale -a</code></pre>
</blockquote>
<p>Si par malheur le modèle désiré n&#8217;est pas listé, je procède à sa génération:</p>
<blockquote style="font-style: normal;"><pre><code>$ locale-gen fr_CH.UTF8</code></pre>
</blockquote>
<p>Ces deux étapes terminées, il m&#8217;est possible d&#8217;exécuter une application dans une autre langue que celle utilisée par défaut lors du démarrage de <code>GNOME</code>.</p>
<h2 id="appli">Paramètres régionaux pour une application</h2>
<p>Le démarrage d&#8217;une application dans une autre langue peut ce faire soit via un <code>terminal</code> soit via un <code>launcher</code>.</p>
<p><strong>Depuis un terminal</strong></p>
<blockquote style="font-style: normal;">
<pre><strong>Syntaxe:</strong>
<code>LC_ALL=[language] [application]</code></pre>
<pre><strong>Exemple:</strong>
<code>$ LC_ALL=fr_CH.utf8 gedit</code></pre>
</blockquote>
<p><strong>Depuis un launcher</strong></p>
<blockquote style="font-style: normal;"><p>Un launcher <code>GNOME</code> démarre l&#8217;application en fonction des paramètres régionaux. Pour cette raison, je pense qu&#8217;essayer de modifier ce comportement ne serait pas très judicieux.</p>
<p>    C&#8217;est pourquoi, partant du principe que la solution présentée plus haut pour le démarrage depuis le terminal n&#8217;était pas trop mauvaise, j&#8217;ai créé un script <code>bash</code> très basic pour contourner le problème.</p>
<p><strong>Fichier <code>customLC.sh</code></strong></p>
<pre class="brush: shell">#!/bin/bash
# -*- coding: utf-8 -*-

LC_ALL=fr_CH.utf8 $1</pre>
<pre><strong>Syntaxe:</strong>
<code>bash customLC.sh [application]
ou
bash customLC.sh "[application] [options]"</code></pre>
<p>    Pour utiliser ce script dans un <code>launcher</code>, il suffit de renseigner le champs <code>Command</code> avec la syntaxe utilisée pour lancer le script dans un <code>terminal</code>.</p>
<pre><strong>Exemple:</strong>
<code>bash customLC.sh "firefox %u"</code></pre>
<table class="admonition">
<tr>
<td><img src="./images/icons/warning.png" alt="Note" /></td>
<td>L&#8217;utilisation des guillemets et nécessaire si vous désirez passez des paramètres d&#8217;exécution à l&#8217;application.</td>
</tr>
</table>
</blockquote>
<h2 id="man">Paramètres régionaux des manpages</h2>
<p>Pour consulter les pages de manuel dans une autre langue, il faut au préalable installer les packages de traduction.</p>
<pre><strong>Exemple pour les packages français:</strong>
<code>sudo apt-get install manpages-fr manpages-fr-extra manpages-fr-dev</code></pre>
<p>Ensuite, la consultation des pages de <code>man</code> s&#8217;effectue avec la syntaxe <code>shell</code> suivante:</p>
<pre><strong>Syntaxe:</strong>
<code>LC_ALL=[language] man [command]
ou
man -L [language] [command]
</code></pre>
<pre><strong>Exemples:</strong>
<code>$ LC_ALL=fr_CH.UTF8 man ls
ou
$ man -L fr_CH.UTF8 ls
</code></pre>
<table class="admonition">
<tr>
<td><img src="./images/icons/note.png" alt="Note" /></td>
<td>Les pages <code>man</code> ne sont pas toujours traduites et sont souvent plus complète dans la version anglaise</td>
</tr>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.rapazp.ch/?feed=rss2&amp;p=298</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Finaliser une installation Ubuntu</title>
		<link>http://www.rapazp.ch/?p=289</link>
		<comments>http://www.rapazp.ch/?p=289#comments</comments>
		<pubDate>Sat, 15 May 2010 19:39:31 +0000</pubDate>
		<dc:creator>pascal.rapaz</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://www.rapazp.ch/?p=289</guid>
		<description><![CDATA[Programme pour finaliser une installation de la distribution <a href="http://www.ubuntu.com/">ubuntu</a>.]]></description>
			<content:encoded><![CDATA[<p>Le script ci-après complète une installation standard d&#8217;<a href="http://www.ubuntu.com/">Ubuntu</a> avec les applications que j&#8217;utilise régulièrement.</p>
<pre><strong>Syntaxe:</strong>
<code>sudo bash install.sh [options]</code>
</pre>
<p>Sans options d&#8217;exécution, uniquement les applications communes à toutes les architectures sont installées. Il est toutefois possible de compléter l&#8217;installation des modules communs par le truchement des options suivantes:</p>
<table>
<col style="width: 25%;"/>
<col style="width: 75%;" />
<tr>
<td colspan="2" style="vertical-align: top;"><strong>Options</strong></td>
</tr>
<tr>
<td style="vertical-align: top;"><code>--nocommon</code></td>
<td style="vertical-align: top;">N&#8217;installe pas les applications communes à toutes les architectures.</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>--noupdate</code></td>
<td style="vertical-align: top;">N&#8217;effectue pas le nettoyage et la mise à jour de la liste des packages (<code>apt</code>).</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>--dev</code></td>
<td style="vertical-align: top;">Installe les applications communes ainsi que les outils de développement</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>-x, --xps</code></td>
<td style="vertical-align: top;">Installe les applications communes, les outils de développement ainsi que certaines applications spécifiques pour un PC Dell XPS.</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>-h, --help</code></td>
<td style="vertical-align: top;">Affiche l&#8217;aide et quitte.</td>
</tr>
</table>
<pre class="brush: py">#!/bin/bash
# -*- coding: utf-8 -*-

##
# =============================================================================
# Script for full system installation
#
# Author : Pascal Rapaz
# Version: 1.0.0
# Date   : 15.05.2010 Creation
#
# License: GPL-2+
#   This package is free software; you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation; either version 2 of the License, or
#   (at your option) any later version.
#
#   This package is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.
#
#   If you need the GNU General Public License write to:
#     Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
#     MA 02110-1301, USA.
#
# (c) 2008-2009, Pascal Rapaz (RapazP - pascal.rapaz@rapazp.ch)
# =============================================================================
##

UBUNTU_NAME=lucid

RED="\033[1;31m%10s %s\033[0m\n"
GREEN="\033[1;32m%10s %s\033[0m\n"
BLUE="\033[1;34m%10s %s\033[0m\n"

# execute the installation script
function launchInstall
{
    _isSuperUser

    printf "$BLUE" "[START]" "Installation script"

    if [ "$update" = "y" ]; then
        _aptList
        _update
    fi

    if [ "$common" = "y" ]; then
        common
    fi

    if [ "$development" = "y" ]; then
        development
    fi

    if [ "$xps" = "y" ]; then
        xps
    fi

    if [ "$update" = "y" ]; then
        _clean
    fi

    printf "$BLUE" "[END]" "Installation script"
}

# install common applications for all systems
function common
{
    # internet
    printf "$GREEN" "[INSTALL]" "Internet applications"
    apt-get -y install thunderbird amule xchat flashplugin-nonfree chromium-browser

    printf "$GREEN" "[INSTALL]" "Office applications"
    apt-get -y install openoffice.org-java-common alexandria

    # photo
    printf "$GREEN" "[INSTALL]" "Image manipulation"
    apt-get -y install geeqie gthumb inkscape

    # audio
    printf "$GREEN" "[INSTALL]" "Audio manipulation"
    apt-get -y install audacious audacious-plugins audacious-plugins-extra lame audacity easytag normalize-audio banshee sound-juicer

    # video and graphics
    printf "$GREEN" "[INSTALL]" "Video manipulation and graphics tools"
    apt-get -y install vlc mplayer mencoder ffmpeg compiz compiz-fusion-bcop compizconfig-settings-manager compiz-fusion-plugins-extra compiz-fusion-plugins-main

    # video codecs
    printf "$GREEN" "[INSTALL]" "Video codecs"
    apt-get -y install gstreamer0.10-ffmpeg gstreamer0.10-plugins-ugly gstreamer0.10-plugins-bad

    # network
    printf "$GREEN" "[INSTALL]" "Network application"
    apt-get -y install samba smbfs ssh gnome-rdp vinagre vino

    # archive manager
    printf "$GREEN" "[INSTALL]" "Archive manager"
    apt-get -y install unace rar p7zip-full

    # compiz
    printf "$GREEN" "[INSTALL]" "Miscalenous"
    apt-get -y install tomboy grsync purrr cvs asciidoc fop gparted fslint alexandria python-wxgtk2.8 vim grub2-splashimages htop comixcursors google-gadgets-gtk

    printf "$BLUE" "[INFO]" "Following applications must be added manually:"
    printf "$BLUE" "" "ubuntu-tweak DBVisualizer Eclipse Jajuk Opera Nero VirtualBox Xaraxtreme Zattoo"
}

# install particular applications for XPS
function xps
{
    # G15 LCD
    printf "$GREEN" "[INSTALL]" "Logitech G15 LCD screen"
    apt-get -y install g15composer g15daemon g15daemon-audacious g15stats
}

# install applications for development
function development
{
    # dev
    printf "$GREEN" "[INSTALL]" "Development"
    apt-get -y install sun-java6-jdk sun-java6-plugin meld python-pyexiv2 glade libbluetooth-dev bluefish

    # debian packages
    printf "$GREEN" "[INSTALL]" "Tools for debian packages creation"
    apt-get -y install build-essential dpkg-dev debhelper devscripts fakeroot alien

    # network security
    printf "$GREEN" "[INSTALL]" "Network security"
    apt-get -y install aircrack-ng kismet zenmap

    # language
    printf "$GREEN" "[INSTALL]" "Language support"
    apt-get -y install manpages-fr-extra manpages-fr-dev
}

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Packages management
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# create apt list for specific applications
function _aptList
{
    printf "$GREEN" "[INFO]" "create list file for specific repositories then get gpg signature"

    # Banshee
    FILE=/etc/apt/sources.list.d/banshee.list
    printf "$GREEN" "[ADD]" "Banshee repository"

    echo deb http://ppa.launchpad.net/banshee-team/banshee-unstable/ubuntu $UBUNTU_NAME main > $FILE
    apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6E80C6B7

    # Bluefish
    FILE=/etc/apt/sources.list.d/bluefish.list
    printf "$GREEN" "[ADD]" "Bluefish repository"

    echo deb http://debian.wgdd.de/ubuntu jaunty main restricted universe multiverse > $FILE
    apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 0F719C35E394D996

    # Alexandria
    FILE=/etc/apt/sources.list.d/alexandria.list
    printf "$GREEN" "[ADD]" "Alexandria repository"

    echo deb http://ppa.launchpad.net/alexandria-team/ppa/ubuntu $UBUNTU_NAME main
    apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 929E5EC4
}

# update repository
function _update
{
    printf "$GREEN" "[CLEAN]" "update packages list"
    apt-get update
}

# clean repository
function _clean
{
    printf "$GREEN" "[CLEAN]" "Remove packages there is no longer requiered"
    apt-get -y autoremove
}

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Helper functions
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Check if user are in su mode
function _isSuperUser
{
    # Test if you're in super-user mode
    if [ ! `id -u` -eq 0 ]
    then
        printf "$RED" "[ERROR]" "You must have root privileges to run this command!"
        exit 1
    fi
}

# print help
function usage
{
    echo
    echo "Usage: sudo bash install.sh [OPTION] "
    echo "Complete the ubuntu standard installation with custom applications"
    echo "Without any options, install only common applications"
    echo
    echo " Parameters:"
    echo "      --nocommon     Don't install common applications"
    echo "      --noupdate     Don't update or clean apt package list"
    echo "      --dev          Install common and development applications"
    echo "  -x, --xps          Install common, development and XPS specific applications"
    echo
    echo "  -h,   --help       Display this help then quit"
}

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Launch part
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# retrieve command parameters
common=y
update=y
while [ "$1" != "" ]; do
    case $1 in
        --nocommon )  common=n
                      ;;
        --noupdate )  update=n
                      ;;
        --dev )       development=y
                      ;;
        -x | --xps )  xps=y
                      development=y
                      ;;
        -h | --help ) usage
                      exit
                      ;;
    esac
    shift
done

launchInstall</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.rapazp.ch/?feed=rss2&amp;p=289</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Recherches avec la commande find</title>
		<link>http://www.rapazp.ch/?p=273</link>
		<comments>http://www.rapazp.ch/?p=273#comments</comments>
		<pubDate>Wed, 12 May 2010 05:12:28 +0000</pubDate>
		<dc:creator>pascal.rapaz</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Shell]]></category>

		<guid isPermaLink="false">http://www.rapazp.ch/?p=273</guid>
		<description><![CDATA[Utilisation de la commande <code>find</code> et des opérateurs de redirection pour effectuer des recherches.]]></description>
			<content:encoded><![CDATA[<h2 id="toc">Table des matières</h2>
<ol>
<li><a href="#intro">Introduction</a>
<li><a href="#actions">Actions sur le résultat</a>
<ol style="font-size: 0.8em;">
<li><a href="#xargs"><code>xargs</code></a>
<li><a href="#exec"><code>-exec</code></a>
<li><a href="#sample">Exemples</a>
<ol style="font-size: 0.8em;">
<li><a href="#expression_search">Recherche d&#8217;une expression</a>
<li><a href="#jar_search">Recherche dans des fichiers jar</a>
        </ol>
</ol>
<li><a href="#sources">Sources</a>
</ol>
<h2 id="intro">Introduction</h2>
<p>La commande <code>find</code> permet de chercher des fichiers et éventuellement d&#8217;effectuer une action sur les résultats recherche. Bien que sa syntaxe est quelque peu complexe, il n&#8217;en demeure pas moins qu&#8217;elle est très puissante et souple.</p>
<p>Dans les lignes qui suivent je n&#8217;ai pas pour prétention d&#8217;expliquer le fonctionnement de la commande <code>find</code> mais plutôt de donner quelques astuces afin de vous simplifier la vie lors d&#8217;une recherche.</p>
<p><code>find</code> cherche de manière récursive les fichiers qui correspondent aux critères définis: nom (<em>name</em>), propriétaire (<em>owner</em>), groupe (<em>group</em>), type (<em>type</em>), autorisations (<em>permissions</em>), taille (<em>size</em>), etc.</p>
<pre><strong>Syntaxe:</strong>
<code>find [where] [criteria]</code>
</pre>
<table class="admonition">
<tr>
<td class="icon"><img src="../../images/icons/tip.png" alt="Tip"/></td>
<td>Par défaut, le contenu d&#8217;un répertoire lié symboliquement n&#8217;est pas traité. Pour y remédier, il faut ajouter l&#8217;option &#8216;-L&#8217;.</td>
</tr>
</table>
<h2 id="actions">Actions sur le résultat</h2>
<p>Il existe deux moyens d&#8217;exploiter le résultat d&#8217;une recherche soit via la commande <code>xargs</code>, soit via l&#8217;option <code>-exec</code>, toutes deux ayants certains avantages et inconvénients.</p>
<h3 id="xargs"><code>xargs</code></h3>
<pre><strong>Syntaxe de base:</strong>
<code>find [where] [criteria] | xargs [command]</code>
</pre>
<p><code>xargs</code> divise les arguments reçus en paramètre avec des espaces ou des retour-chariots. Si un nom de fichier (ou de chemin) contient des espaces par exemple &#8220;mon document.odt&#8221;, <code>xargs</code> va interpréter &#8220;mon&#8221; et &#8220;document.odt&#8221; comme étant deux fichiers distincts.</p>
<p>La solution pour éviter ce problème consiste à ajouter le paramètre &#8216;<code>-0</code>&#8216; à la commande <code>xargs</code> et &#8216;<code>-print0</code>&#8216; comme <strong>dernier</strong> argument de la commande <code>find</code>. Ainsi les espaces de fin de chaînes sont remplacés par <code>null</code> au lieu de blanc.</p>
<p>De plus, dans le cas où le résultat de la commande <code>find</code> est vide, <code>xargs</code> ne mettra pas fin au traitement et tentera d&#8217;exécuter la commande cible ce qui peut occasionner une erreur dans le traitement de cette dernière. Pour éviter ce cas de bord on ajoutera l&#8217;option &#8216;<code>-r</code>&#8216; à la commande <code>xargs</code>.</p>
<pre><strong>Syntaxe adaptée:</strong>
<code>find [where] [criteria] -print0 | xargs -0 -r [command]</code>
</pre>
<p><strong>Avantages</strong></p>
<blockquote><ul>
<li>Le traitement des résultats est plus efficace qu&#8217;avec l&#8217;option <code>-exec</code></li>
<li>Le résultat de la commande <code>xargs</code> peut être réutilisée avec un <code>pipe</code> (<code>|</code>)</li>
</ul>
</blockquote>
<h3 id="exec"><code>-exec</code></h3>
<pre><strong>Syntaxe:</strong>
<code>find [where] [criteria] -exec [command] {} \;</code>
</pre>
<p>L&#8217;option <code>-exec</code> (à ne pas confondre avec la commande shell <code>exec</code>) exécute la commande sur chaque fichier trouvé répondant aux critères de recherche.</p>
<p>La paire d&#8217;accolade est automatiquement remplacée par le nom du fichier. Si le nom du fichier contient des caractères spéciaux, le <code>shell</code> tentera de les interpréter. Pour éviter cette interprétation, les accolades doivent être entourées d&#8217;apostrophes (<code>'{}'</code>) ou de guillemets (<code>"{}"</code>).</p>
<p>De plus, l&#8217;instruction à exécuter (ou commande) doit être terminée par les caractères <code>\;</code> (ou <code>';'</code>) précédé d&#8217;un espace.</p>
<h3 id="sample">Exemples</h3>
<h4 id="expression_search">Recherche d&#8217;une expression</h4>
<p>Il est parfois nécessaire de pouvoir rechercher une chaîne de caractères dans une série de fichiers.</p>
<p>Les commandes suivantes effectuent cette recherche depuis le répertoire courant de manière récursive et affiche le résultat dans la console. L&#8217;une utilise la commande <code>xargs</code>, l&#8217;autre l&#8217;option <code>-exec</code> mais au final le résutlat sera identique.</p>
<pre><strong>Syntaxe:</strong>
<code>find . -name '[file_pattern]' -print0 | xargs -0 -r grep --color '[string]'
ou
find . -name '[file_pattern]' -exec grep --color '[string]' '{}' \; -print</code></pre>
<pre><code>$ find . -name '*.txt' -print0 | xargs -0 -r grep --color 'linux'
ou
$ find . -name '*.txt' -exec grep --color 'linux' '{}' \; -print</code></pre>
<h4 id="jar_search">Recherche dans des fichiers jar</h4>
<p>Ci-après la commande <code>find</code> affiche le contenu de tous les fichiers <code>jar</code> depuis le répertoire courant.</p>
<pre><code>$ find -name '*.jar' -exec jar tvf '{}' \;</code></pre>
<p>Bien entendu, le résultat obtenu peut être redirigé avec un <code>PIPE</code> (<code>|</code>) vers une autre commande. Ainsi l&#8217;utilisation de <code>grep</code> permet de filtrer la sortie. </p>
<p>Ici, seuls les fichiers <code>.xml</code> contenus dans les <code>jar</code> seront affichés:</p>
<pre><code>$ find -name '*.jar' -exec jar tvf '{}' \; | grep --color '.xml'</code></pre>
<table class="admonition">
<tr>
<td class="icon"><img src="../../images/icons/tip.png" alt="Tip"/></td>
<td>L&#8217;option <code>--color</code> utilisée avec la commande <code>grep</code> n&#8217;est pas obligatoire. Toutefois elle mets en valeur les résultats de la recherche ce qui simplifie la lecture.</td>
</tr>
</table>
<h2 id="sources">Sources</h2>
<blockquote><ul>
<li><a href="http://goo.gl/3ka8">The find / xargs pipe (en)</a></li>
<li><a href="http://goo.gl/ETin">Bash &#8211; Complex Commands (en)</a></li>
<li><a href="http://goo.gl/Rid5">find (en)</a></li>
<li><a href="http://goo.gl/LkeP">10 Tips for Using GNU Find (en)</a></li>
</ul>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.rapazp.ch/?feed=rss2&amp;p=273</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Raccourcis clavier pour Bash</title>
		<link>http://www.rapazp.ch/?p=266</link>
		<comments>http://www.rapazp.ch/?p=266#comments</comments>
		<pubDate>Tue, 04 May 2010 21:38:32 +0000</pubDate>
		<dc:creator>pascal.rapaz</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Shell]]></category>

		<guid isPermaLink="false">http://www.rapazp.ch/?p=266</guid>
		<description><![CDATA[Quelques raccourcis clavier <code>Bash</code> destinés à vous faciliter la vie.]]></description>
			<content:encoded><![CDATA[<p>Le shell par défaut de la plupart des systèmes d&#8217;exploitation <code>GNU/Linux</code> est appelée <code>Bash</code>. Si vous prévoyez de passer beaucoup de temps avec cette ligne de commandes les raccourcis clavier qui suivent devraient vous simplifier la vie !</p>
<table>
<col style="width: 30%;"/>
<col style="width: 70%;" />
<tr>
<td colspan="2" style="vertical-align: top;"><strong>Déplacement</strong></td>
</tr>
<tr>
<td style="vertical-align: top;"><code>Ctrl + a</code></td>
<td style="vertical-align: top;">Déplace le curseur au début de la ligne courante</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>Ctrl + e</code></td>
<td style="vertical-align: top;">Déplace le curseur à la fin de la ligne courante</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>Alt + b</code></td>
<td style="vertical-align: top;">Déplace le curseur mot à mot vers l&#8217;arrière</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>Alt + f</code></td>
<td style="vertical-align: top;">Déplace le curseur mot à mot vers l&#8217;avant</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>Crtl + xx</code></td>
<td style="vertical-align: top;">Positionne le curseur au début ou à la fin du mot</td>
</tr>
<tr>
<td colspan="2" style="vertical-align: top;"><strong>Edition</strong></td>
</tr>
<tr>
<td style="vertical-align: top;"><code>Ctrl + k</code></td>
<td style="vertical-align: top;">Coupe la ligne après la position du curseur</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>Ctrl + u</code></td>
<td style="vertical-align: top;">Coupe la ligne avant la position du curseur</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>Ctrl + w</code></td>
<td style="vertical-align: top;">Coupe le chaîne avant le curseur</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>Alt + Backspace</code></td>
<td style="vertical-align: top;">Coupe le chaîne avant le curseur mais s&#8217;arrête aux &#8220;/&#8221; et au &#8220;.&#8221;</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>Ctrl + y</code></td>
<td style="vertical-align: top;">Colle la ligne ou la chaîne</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>Ctrl + h</code></td>
<td style="vertical-align: top;">Supprime le caractère avant le curseur (identique touche <code>Backspace</code>)</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>Ctrl + t</code></td>
<td style="vertical-align: top;">Inverse la position des deux caractères avant le curseur</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>Alt + t</code></td>
<td style="vertical-align: top;">Inverse la position des deux mots avant le curseur</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>Alt + c</code></td>
<td style="vertical-align: top;">Met une lettre en majuscule</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>Alt + l</code></td>
<td style="vertical-align: top;">Met un mot en minuscule</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>Alt + u</code></td>
<td style="vertical-align: top;">Met un mot en majuscule</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>Alt + .</code> ou <code>Esc + .</code></td>
<td style="vertical-align: top;">Réécrit le dernier mot de la ligne précédente</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>Crtl + _</code></td>
<td style="vertical-align: top;">Annule la dernière modification</td>
</tr>
<tr>
<td colspan="2" style="vertical-align: top;"><strong>Historique</strong></td>
</tr>
<tr>
<td style="vertical-align: top;"><code>Ctrl + r</code></td>
<td style="vertical-align: top;">Recherche parmi les commandes précédentes</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>Ctrl + p</code></td>
<td style="vertical-align: top;">Commande précédente</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>Ctrl + n</code></td>
<td style="vertical-align: top;">Commande suivante</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>^[chaîne 1]^[chaîne 2]^</code></td>
<td style="vertical-align: top;">Exécute la dernière commande en remplaçant la <code>[chaîne 1]</code> par la <code>[chaîne 2]</code></td>
</tr>
<tr>
<td style="vertical-align: top;"><code>!#</code></td>
<td style="vertical-align: top;">Exécute la plus ancienne commande de l&#8217;historique</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>!!</code></td>
<td style="vertical-align: top;">Exécute la dernière commande</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>! + [chaîne]</code></td>
<td style="vertical-align: top;">Exécute la dernière commande commançant par la <code>[chaîne]</code> de caractères</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>!? + [chaîne]</code></td>
<td style="vertical-align: top;">Exécute la dernière commande contenant la <code>[chaîne]</code> de caractères</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>! + [n]</code></td>
<td style="vertical-align: top;">Rappelle la commande lancée il y a <code>[n]</code> commandes</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>[commande] + !^</code></td>
<td style="vertical-align: top;">Exécute la commande avec le premier argument de la commande précédente</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>[commande] + !:[n]-[m]</code></td>
<td style="vertical-align: top;">Exécute la commande avec les arguments de <code>[n]</code> à <code>[m]</code> de la commande précédente</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>[commande] + !:[n]</code></td>
<td style="vertical-align: top;">Exécute la commande avec l&#8217;argument <code>[n]</code> de la commande précédente</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>[commande] + !$</code></td>
<td style="vertical-align: top;">Exécute la commande avec le dernier argument de la commande précédente</td>
</tr>
<tr>
<td colspan="2" style="vertical-align: top;"><strong>Processus</strong></td>
</tr>
<tr>
<td style="vertical-align: top;"><code>Ctrl + c</code></td>
<td style="vertical-align: top;">Arrête la commande en cours</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>Ctrl + d</code></td>
<td style="vertical-align: top;">Quitte le <code>shell</code> courant</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>Ctrl + z</code></td>
<td style="vertical-align: top;">&#8220;Suspend&#8221; l&#8217;exécution de tous les processus en cours d&#8217;exécution. Les commandes <code>fg</code> ou <code>bg</code> permettent de (re)démarrer les processus.</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>Ctrl + s</code></td>
<td style="vertical-align: top;">Masque la saisie et suspends le défilement (<code>Ctrl + q</code> pour revenir)</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>Ctrl + q</code></td>
<td style="vertical-align: top;">Fait apparaître la saisie et relance l&#8217;affichage</td>
</tr>
<tr>
<td colspan="2" style="vertical-align: top;"><strong>Divers</strong></td>
</tr>
<tr>
<td style="vertical-align: top;"><code>Tab</code></td>
<td style="vertical-align: top;">Complète automatiquement le nom du fichier ou répertoire</td>
</tr>
<tr>
<td style="vertical-align: top;"><code>Ctrl + l</code></td>
<td style="vertical-align: top;">Efface le contenu de l&#8217;écran (idem commande <code>clear</code>)</td>
</tr>
</table>
<table class="admonition">
<tr>
<td><img src="./images/icons/note.png" alt="Note" /></td>
<td>Certaine de ces commandes ne fonctionnent pas selon que vous accédez au <code>bash</code> via une session <code>telnet/ssh</code> ou selon la façon dont vous avez organiser les touches de votre clavier.</td>
</tr>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.rapazp.ch/?feed=rss2&amp;p=266</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Synchronisation de fichiers</title>
		<link>http://www.rapazp.ch/?p=9</link>
		<comments>http://www.rapazp.ch/?p=9#comments</comments>
		<pubDate>Wed, 21 Apr 2010 21:45:26 +0000</pubDate>
		<dc:creator>pascal.rapaz</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://www.rapazp.ch/?p=9</guid>
		<description><![CDATA[Programme pour automatiser la synchronisation de répertoires et fichiers contenant des espaces par le truchement de l'outil <a href="http://rsync.samba.org/">rsync</a>.]]></description>
			<content:encoded><![CDATA[<h2>Outil &#8216;rsync&#8217;</h2>
<p>Après avoir sué vainement pour synchroniser des répertoires et fichiers contenant des espaces par le biai d&#8217;un script <em>bash</em>, c&#8217;est tout naturellement que je me suis tourné vers <em>python</em> pour essayer de résoudre mon problème.</p>
<p>Quelques minutes ont suffit pour que mon appel de commande <a href="http://rsync.samba.org/">rsync</a> soit opérationnel et utilisable. Cerise sur le gâteau, il est également possible d&#8217;utiliser des variables <em>source</em> et <em>destination</em> pour définir des listes de répertoires à synchroniser.</p>
<pre class="brush: py">#!/usr/bin/env python
# -*- coding: utf-8 -*-

##
# =============================================================================
# Author : Pascal Rapaz
# Version: 1.0.0
# Date   : 15.04.2010 Creation
#          19.04.2010 Added loop for multiple folders sync
#          22.04.2010 Added zenity to display execution log
#
# License: GPL-2+
#   This package is free software; you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation; either version 2 of the License, or
#   (at your option) any later version.
#
#   This package is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.
#
#   If you need the GNU General Public License write to:
#     Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
#     MA 02110-1301, USA.
#
# (c) 2010, Pascal Rapaz (RapazP - pascal.rapaz@rapazp.ch)
# =============================================================================
##
"""
Use rsync to synchronize files and folder even if there contains spaces.

To sync between a Linux and a Windows system, usually I use these options:
   OPTS="-rvDz"

To sync two Linux systems, usually I use these options:
   OPTS="-av"
"""

from subprocess import Popen, PIPE

# source and destination folders
SRC = ["/mnt/win_share/projets en cours/Spécifications métier/",
       "/mnt/win_share/RP/MPP/projets en cours/Spécifications techniques/"
      ]
DEST = ["/home/user/project/Specifications_metier/",
        "/home/user/project/Specifications_techniques/"
       ]

# rsync options
OPTS = "-rvDz"
FILES = "--include '*.doc' --include '*.xls' --include '*.ppt' --include '*.pdf' " +\
        "--exclude '*.*' --exclude '@rchive'"

GLOBAL_STDOUT = ''
GLOBAL_STDERR = ''

# prepare and launch the command
for i in range(0, len(SRC)):
    cmd = "rsync " + OPTS + " " + FILES + " '" + SRC[i] + "' '" + DEST[i] + "' "
    stdout, stderr = Popen(cmd, shell=True, stdout=PIPE, stderr=PIPE).communicate()

    GLOBAL_STDOUT += "\n[cmd] " + cmd + "\n\n" + stdout
    GLOBAL_STDERR += stderr
#endFor

# use zenity to open a gtk dialog box that display sdtout and stderr
if (GLOBAL_STDOUT.strip() != '' or
    GLOBAL_STDERR.strip() != ''):

    log = "[STDOUT]\n" + GLOBAL_STDOUT

    if (GLOBAL_STDERR.strip() != ''):
        log += "\n[STDERR]\n" + GLOBAL_STDERR
    #endIf

    cmd = 'echo "%s" | zenity --height="480" --width="640" --text-info --title="Execution log"' %(log)

    Popen(cmd, shell=True).communicate()
#endIf</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.rapazp.ch/?feed=rss2&amp;p=9</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
