<?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>gablog &#187; linux</title>
	<atom:link href="http://gabo.homelinux.com/tag/linux/feed/" rel="self" type="application/rss+xml" />
	<link>http://gabo.homelinux.com</link>
	<description>Fino ad ora ho avuto un sito brutto. Ora ho un blog.</description>
	<lastBuildDate>Fri, 13 Nov 2009 14:29:27 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>it</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Shared Memory in PHP</title>
		<link>http://gabo.homelinux.com/2009/06/shared-memory-in-php/</link>
		<comments>http://gabo.homelinux.com/2009/06/shared-memory-in-php/#comments</comments>
		<pubDate>Mon, 08 Jun 2009 13:21:07 +0000</pubDate>
		<dc:creator>gabo</dc:creator>
				<category><![CDATA[programmazione]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://gabo.homelinux.com/?p=402</guid>
		<description><![CDATA[Navigando sul web ho trovato poca documentazione a proposito della gestione della shared memory mediante PHP, ed anche il manuale ufficiale non è molto chiaro. Ho deciso di fare un esperimento, ed ho scoperto che è un ottimo metodo per far comunicare due sessioni senza far uso intensivo di database e file temporanei, con il [...]]]></description>
			<content:encoded><![CDATA[<p>Navigando sul web ho trovato poca documentazione a proposito della gestione della shared memory mediante PHP, ed anche il manuale ufficiale non è molto chiaro. Ho deciso di fare un esperimento, ed ho scoperto che è un ottimo metodo per far comunicare due sessioni senza far uso intensivo di database e file temporanei, con il grande vantaggio di poter usare le potenzialità offerte dai semafori, senza dove riscrivere del proprio codice per questa delicata operazione.</p> <p>Gli utilizzi sono molteplici, nel mio caso si tratta di far comunicare due applicazioni flash usando delle pagine php come ponte, nel modo più veloce e meno oneroso possibile. La prima applicazione inizializza semaforo, memoria condivisa  e variabile di comunicazione, sfruttando come discriminante il proprio id di sessione.</p> 

<pre class="brush: php;">
&lt;?php
/* start.php */
session_start();

$MEMSIZE = 512; //  dimensione della memoria condivisa (byte)

$filename = session_save_path() . '/sess_' . session_id();
echo &quot;$filename&lt;br /&gt;\n&quot;;

$SEMKEY = ftok('/','S');    //  key semaforo
$SHMKEY = ftok('/','M');    //  key shared memory
echo &quot;$SEMKEY [semaforo]&lt;br /&gt;\n&quot;;
echo &quot;$SHMKEY [shared mem]&lt;br /&gt;\n&quot;;

// Creo il semaforo
$sem_id = sem_get($SEMKEY, 1);
if ($sem_id !== false) {
	echo &quot;Semaforo creato [$sem_id]&lt;br /&gt;\n&quot;;

	// Acquisisco il semaforo
	if (sem_acquire($sem_id)) {
		echo &quot;Semaforo acquisito [$sem_id]&lt;br /&gt;\n&quot;;

		// Associo la shared mem al semaforo
		$shm_id = shm_attach($SHMKEY, $MEMSIZE);
		if ($shm_id !== false) {
			echo &quot;Memoria condivisa associata [$shm_id]&lt;br /&gt;\n&quot;;

			// Inializzo la variabile
			if (shm_put_var($shm_id, 1, &quot;Variable 1 ciao&quot;)) {
				echo &quot;Variabile inizalizzata&lt;br /&gt;\n&quot;;

				// Rilascio il semaforo
				if (sem_release($sem_id)){
					echo &quot;Semaforo rilasciato&lt;br /&gt;\n&quot;;
				} else {
					echo &quot;Errore nel rilascio del semaforo&lt;br /&gt;\n&quot;;
					sem_remove($sem_id);
					shm_remove($shm_id);
				}
				
			} else {
				echo &quot;Errore nella scrittura della variabile&lt;br /&gt;\n&quot;;
				sem_remove($sem_id);
				shm_remove($shm_id);
			}
		} else {
			echo &quot;Errore nell'associazione della memoria condivisa&lt;br /&gt;\n&quot;;
			sem_remove($sem_id);
		}
	} else {
		echo &quot;Errore nell'acquisizione del semaforo&lt;br /&gt;\n&quot;;
		sem_remove($sem_id);
	}
} else {
	echo &quot;Errore nella creazione del semaforo&lt;br /&gt;\n&quot;;
}
&lt;?
</pre>

<p>A questo punto la sessione paritaria deve soltanto conoscere l'id della sessione con cui vuole comunicare, in modo da poter inizializzare le chiavi del semaforo e della memoria condivisa. Richiamando il codice seguente, per esempio, può leggere il valore della variabile condivisa:</p> 

<pre class="brush: php;">
/* read.php */
&lt;?php
session_start();

if (isset($_GET['file'])){

	$filename = $_GET['file'];
	echo &quot;$filename&lt;br /&gt;\n&quot;;

	$MEMSIZE = 512;             //  dimensione della memoria condivisa (byte)
	$SEMKEY = ftok('/','S');    //  key semaforo
	$SHMKEY = ftok('/','M');    //  key shared memory
	echo &quot;$SEMKEY [semaforo]&lt;br /&gt;\n&quot;;
	echo &quot;$SHMKEY [shared mem]&lt;br /&gt;\n&quot;;

	// Creo il semaforo
	$sem_id = sem_get($SEMKEY, 1);
	if ($sem_id !== false) {
		echo &quot;Semaforo creato [$sem_id]&lt;br /&gt;\n&quot;;

		// Acquisisco il semaforo
		if (sem_acquire($sem_id)) {
			echo &quot;Semaforo acquisito [$sem_id]&lt;br /&gt;\n&quot;;

			// Associo la shared mem al semaforo
			$shm_id = shm_attach($SHMKEY, $MEMSIZE);
			if ($shm_id !== false) {
				echo &quot;Memoria condivisa associata [$shm_id]&lt;br /&gt;\n&quot;;

				// Leggo la variabile
				$var1 = shm_get_var($shm_id, 1);
				if ($var1 !== false) {
					echo &quot;Variabile letta [$var1]&lt;br /&gt;\n&quot;;

					// Rilascio il semaforo
					if (sem_release($sem_id)){
						echo &quot;Semaforo rilasciato&lt;br /&gt;\n&quot;;
					} else {
						echo &quot;Errore nel rilascio del semaforo&lt;br /&gt;\n&quot;;
						sem_remove($sem_id);
						shm_remove($shm_id);
					}
					
				} else {
					echo &quot;Errore nella lettura della variabile&lt;br /&gt;\n&quot;;
					sem_remove($sem_id);
					shm_remove($shm_id);
				}
			} else {
				echo &quot;Errore nell'associazione della memoria condivisa&lt;br /&gt;\n&quot;;
				sem_remove($sem_id);
			}
		} else {
			echo &quot;Errore nell'acquisizione del semaforo&lt;br /&gt;\n&quot;;
			sem_remove($sem_id);
		}
	} else {
		echo &quot;Errore nella creazione del semaforo&lt;br /&gt;\n&quot;;
	}
} else {

?&gt;

&lt;form action='read.php' method='get'&gt;
  &lt;input type='text' name='file' /&gt;&lt;br /&gt;
  &lt;input type='submit' /&gt;
&lt;/form&gt;

&lt;?php
}
?&gt;
</pre>

<p>Richiamando (da un altro browser) la pagina senza parametri viene presentata una form che richiede l'inserimento del path del file di sessione del paritario. In questo caso basta un cut/paste dall'output della pagina precedente, in un applicazione reale ci si appoggierà ad un database. Inserendolo si prende il controllo del semaforo, ed in seguito si può leggere il contenuto della variabile di sessione. In modo del tutto analogo si può modificare il contenuto della variabile:</p> 

<pre class="brush: php;">
/* write.php */
&lt;?php
session_start();

if (isset($_GET['file']) &amp;&amp; isset($_GET['value'])){

	$filename = $_GET['file'];
	echo &quot;$filename&lt;br /&gt;\n&quot;;
	$value = $_GET['value'];
	echo &quot;$value&lt;br /&gt;\n&quot;;

	$MEMSIZE = 512;             //  dimensione della memoria condivisa (byte)
	$SEMKEY = ftok('/','S');    //  key semaforo
	$SHMKEY = ftok('/','M');    //  key shared memory
	echo &quot;$SEMKEY [semaforo]&lt;br /&gt;\n&quot;;
	echo &quot;$SHMKEY [shared mem]&lt;br /&gt;\n&quot;;

	// Creo il semaforo
	$sem_id = sem_get($SEMKEY, 1);
	if ($sem_id !== false) {
		echo &quot;Semaforo creato [$sem_id]&lt;br /&gt;\n&quot;;

		// Acquisisco il semaforo
		if (sem_acquire($sem_id)) {
			echo &quot;Semaforo acquisito [$sem_id]&lt;br /&gt;\n&quot;;

			// Associo la shared mem al semaforo
			$shm_id = shm_attach($SHMKEY, $MEMSIZE);
			if ($shm_id !== false) {
				echo &quot;Memoria condivisa associata [$shm_id]&lt;br /&gt;\n&quot;;

				// Scrivo la variabile
				if (shm_put_var($shm_id, 1, $value)) {
					echo &quot;Variabile scritta [$value]&lt;br /&gt;\n&quot;;

					// Rilascio il semaforo
					if (sem_release($sem_id)){
						echo &quot;Semaforo rilasciato&lt;br /&gt;\n&quot;;
					} else {
						echo &quot;Errore nel rilascio del semaforo&lt;br /&gt;\n&quot;;
						sem_remove($sem_id);
						shm_remove($shm_id);
					}
					
				} else {
					echo &quot;Errore nella scrittura della variabile&lt;br /&gt;\n&quot;;
					sem_remove($sem_id);
					shm_remove($shm_id);
				}
			} else {
				echo &quot;Errore nell'associazione della memoria condivisa&lt;br /&gt;\n&quot;;
				sem_remove($sem_id);
			}
		} else {
			echo &quot;Errore nell'acquisizione del semaforo&lt;br /&gt;\n&quot;;
			sem_remove($sem_id);
		}
	} else {
		echo &quot;Errore nella creazione del semaforo&lt;br /&gt;\n&quot;;
	}
} else {

?&gt;

&lt;form action='write.php' method='get'&gt;
	&lt;input type='text' name='file' /&gt;&lt;br /&gt;
	&lt;input type='text' name='value' /&gt;&lt;br /&gt;
	&lt;input type='submit' /&gt;
&lt;/form&gt;

&lt;?php
}
?&gt;
</pre>

<p>A questo punto non resta che da implementare una pagina per distruggere l'area di memoria condivisa, in modo da non incappare in problemi di saturazione della memoria.</p> 
<p>Lascio la creazione di tale pagina come esercizio, dato che non trovo più il relativo sorgente <img src='http://gabo.homelinux.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>

<pre class="brush: php;">
/* delete.php */
</pre>

<p>Il codice presentato è un semplice proof of concept, e non è da intendersi valido per un utilizzo in produzione. Mancano tutta una serie di controlli sulla corretta gestione della memoria, sulla validazione del paritario e del necessario timing nel caso in cui si cerchi di accedere ad un semaforo "rosso". Magari in un prossimo post affronterò la questione, per ora devo andarmela a studiare <img src='http://gabo.homelinux.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p> 
<p>Happy coding!</p>]]></content:encoded>
			<wfw:commentRss>http://gabo.homelinux.com/2009/06/shared-memory-in-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aggiornamento etch -&gt; lenny</title>
		<link>http://gabo.homelinux.com/2009/03/aggiornamento-etch-lenny/</link>
		<comments>http://gabo.homelinux.com/2009/03/aggiornamento-etch-lenny/#comments</comments>
		<pubDate>Wed, 11 Mar 2009 19:10:06 +0000</pubDate>
		<dc:creator>gabo</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[etch]]></category>
		<category><![CDATA[lenny]]></category>

		<guid isPermaLink="false">http://gabo.homelinux.com/?p=148</guid>
		<description><![CDATA[Il 14 febbraio 2009 la distribuzine Debian 5.0 (lenny) è passata da testing a stable, quindi mi accingo all'upgrade. Probabilmente lo farò anche sui server in produzione dell'ufficio, ma comincio con il mio server domestico, dato che è il mio primo dist-upgrade.
Backup
Come prima cosa provvedo ad un bel backup complessivo della macchina, un bell'rsync totale [...]]]></description>
			<content:encoded><![CDATA[<p>Il 14 febbraio 2009 la distribuzine Debian 5.0 (lenny) è passata da testing a stable, quindi mi accingo all'upgrade. Probabilmente lo farò anche sui server in produzione dell'ufficio, ma comincio con il mio server domestico, dato che è il mio primo <strong>dist-upgrade.</strong></p>
<h3>Backup</h3>
<p>Come prima cosa provvedo ad un bel backup complessivo della macchina, un bell'rsync totale che mi permetterà, nel caso qualcosa vada storto, di ripristinare la situazione di partenza. A tal uopo (erano anni che sognavo di dirlo) utilizzo il seguente script:</p>

<pre class="brush: bash;">
rsync -vrpoglHDIt --delete --progress \
--exclude=/proc --exclude=/sys --exclude=/tmp --exclude=/var/run \
--exclude=/var/lock --exclude=/var/tmp --exclude=/var/backups \
--exclude=/var/cache --exclude=/var/tmp \
--exclude=/mnt/multimedia --exclude=/mnt/mp3 \
/ /mnt/multimedia/backup
</pre>

<p>Al posto di escludere una ad una le directory avrei potuto usare un file <em>not_rsync</em>, ma per motivi puramente blog-istici ho preferito usare questa modalità.  In realtà nello script che uso per backuppare da remoto i server di produzione ho anche
<pre>--exclude=/boot/grub/ --exclude=/etc/network --exclude=/etc/fstab \</pre>
Ma non dovrebbero dare problemi. Sinceramente non ricordo perchè quando preparai il backup esclusi tali directory e file.</p>

<p>Per sincronizzazioni successive basta eliminare il parametro I di rsync, che il man descrive così:
<pre>-I, --ignore-times          don't skip files that match size and time
    --size-only             skip files that match in size
    --modify-window=NUM     compare mod-times with reduced accuracy</pre>
In questo modo le successive sincronizzazioni saranno più accurate. Conviene, a questo punto, schedularle con un cronjob.</p>
<h3>Upgrade</h3>
<p>Ora che sono tranquillo e beato posso procedere all'upgrade vero e proprio. Come da manuale leggo le <a href="http://debian.org/releases/stable/i386/release-notes/ch-upgrading.it.html">relase-notes </a>sul sito debian.org, e faccio tutti i controlli per verificare la presenza di eventuali pacchetti problematici. Non ne trovo nessuno.</p>
<p>Modifico /etc/apt/sources.list per farlo puntare ai repository di lenny:</p>

<pre class="brush: bash;">
deb http://ftp.it.debian.org/debian/ lenny main
deb-src http://ftp.it.debian.org/debian/ lenny main
deb http://security.debian.org/ lenny/updates main
deb-src http://security.debian.org/ lenny/updates main
</pre>

<p>Con il comando seguente abilito il logging della sessione su un file di testo, nel caso in cui qualcosa vada storto</p>

<pre class="brush: bash;">
script -t 2&gt;~/upgrade-lenny.time -a ~/upgrade-lenny.script
</pre>

<p>Aggiorno finalmente la lista dei pacchetti</p>

<pre class="brush: bash;">
aptitude update
</pre>

<p>Aggiorno la apt e aptitude, comprese alcune dipendenze</p>

<pre class="brush: bash;">
apt-get install apt
</pre>

<p>E qui c'è la prima differenza rispetto alle relases-note, il comando precedente mi disinstalla/upgrada/installa un sacco di pacchetti. Chiedendo qua e la su forum e newsgroup noto che ad altri è già successo, e gli è andata bene. Altra differenza rispetto al documento che sto seguendo è relativa al prossimo comando, dato che aptitude è stato disinstallato in quel blocco di pacchetti citati poco fa. Dopo averlo re-installato con apt-get lo aggiorno:</p>

<pre class="brush: bash;">
aptitude install aptitude
</pre>

<p>Di nuovo un sacco di pacchetti rimossi, aggiornati ed installati. Ho risposto con i default a tutte le domande (dopo averle lette e capite), sembra che tutto sia a posto.  Aggiorno la lista di pacchetti a disposizione di aptitude con un</p>

<pre class="brush: bash;">
aptitude search &quot;?false&quot;
</pre>

<p>E posso proseguire con l'aggiornamento minimo del sistema, necessario prima del dist-upgrade vero e proprio:</p>

<pre class="brush: bash;">
aptitude upgrade
</pre>

<p>Trattandosi di un server posso proseguire al dist-upgrade, non avendo bisogno di aggiornare il supporto ad X</p>

<pre class="brush: bash;">
aptitude dist-upgrade
</pre>

<p>Una rispolverata all'MBR, in modo da bootare con il nuovo kernel 2.6.26-1, lasciando la possibilità di usare il 2.6.18-6</p>

<pre class="brush: bash;">
lilo -v
</pre>

<p>Dopo una lettura dei possibili problemi a cui potrei andare incontro, decido di riavviare. Al massimo il sito sarà irraggiungibile per un po'... Incorcio le dita e digito un bel</p>

<pre class="brush: bash;">
reboot
</pre>

<p>E come per magia eccomi qua con la mia lenny nuova fiammante:</p>

<pre class="brush: bash;">
g4b0@debian:~$ more /etc/debian_version
5.0
g4b0@debian:~$ uname -a
Linux debian 2.6.26-1-686 #1 SMP Sat Jan 10 18:29:31 UTC 2009 i686 GNU/Linux
g4b0@debian:~$
</pre>

<p>Anche se rimarrò sempre fedele ed affezionato alla mia Slackware, che uso come desktop, devo dire che debian mi da delle grandi soddisfazioni... Ora devo controllare lo stato dei pacchetti, l'integrità e l'ordine del sistema, ma prima mi dovrò studiare un po' il funzionamento del sistema di package di lenny.</p>]]></content:encoded>
			<wfw:commentRss>http://gabo.homelinux.com/2009/03/aggiornamento-etch-lenny/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>La cazzata del giorno</title>
		<link>http://gabo.homelinux.com/2009/03/la-cazzata-del-giorno/</link>
		<comments>http://gabo.homelinux.com/2009/03/la-cazzata-del-giorno/#comments</comments>
		<pubDate>Thu, 05 Mar 2009 14:55:57 +0000</pubDate>
		<dc:creator>gabo</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[allegati]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[gnu]]></category>

		<guid isPermaLink="false">http://gabo.homelinux.com/?p=162</guid>
		<description><![CDATA[Inviare allegati Office nelle proprie email è maleducazione.]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-163 alignright" style="margin-left: 10px; margin-right: 10px;" title="cazzata" src="http://gabo.homelinux.com/wp-content/uploads/2009/03/cazzata.jpg" alt="cazzata" width="85" height="420" />Navigando su internet mi sono imbattuto nella pubblicità qua di fianco, a dir poco ridicola! Un PC senza Office 2007 è come un pacchetto senza il regalo dentro. Che cazzata!</p>
<p>Da quando mi sono liberato dal software Microsoft passando a Linux, solo più una cosa mi turba il karma: gli allegati Office alle email! Perfavore, smettetela di mandarmi allegati Word, Excel o Power Point, io non ho un computer, ma una scatola senza regalo!!</p>
<p>Ne parla con il suo modo visionario/profetico anche Richard M. Stallman, in questo <a href="http://www.gnu.org/philosophy/no-word-attachments.html">documento</a>, in cui spiega il perchè è maleducazione inviare questo tipo di allegati.</p>
<p>Sarebbe ora che l&#8217;utente medio capisse che esistono alternative gratuite ed intellettualmente più appaganti del pagare una licenza software, o di rubarla&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://gabo.homelinux.com/2009/03/la-cazzata-del-giorno/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sostituzione ricorsiva di regular expression</title>
		<link>http://gabo.homelinux.com/2009/02/sostituzione-ricorsiva-di-regular-expression/</link>
		<comments>http://gabo.homelinux.com/2009/02/sostituzione-ricorsiva-di-regular-expression/#comments</comments>
		<pubDate>Fri, 27 Feb 2009 10:38:48 +0000</pubDate>
		<dc:creator>gabo</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[regexp]]></category>
		<category><![CDATA[ricorsione]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://gabo.homelinux.com/?p=67</guid>
		<description><![CDATA[Script che sostituisce _ricorsivamente_ tutte le occorrenze della regexp passata come primo parametro con la regexp passata come secondo parametro, a partire dalla dir attuale o da quella specificata come terzo parametro]]></description>
			<content:encoded><![CDATA[<p>Questo script mi è tornato utile in un sacco di situazioni, permette di sostiruire ricorsivamente la regexp passata come primo argomento con la regexp passata come secondo. Il core dello script è la funzione chsrt_ric:</p>
<pre class="brush: bash;">
function chstr_ric () {

  echo -e &quot;Num par: $#\n$0\n$1\n$2\n$3\n&quot;

# se non è specificata la dir di partenza parto da quella attuale
  if [ -z &quot;$3&quot; ]; then
    DIR=$PWD
  else
    DIR=$3
  fi

# Entro nella dir
  echo -e &quot;directory root: $DIR\n&quot;
  cd $DIR

  for FILE in * ; do
    if [ -d $FILE ] ; then
      echo -e &quot;\n*************\nEntro dentro a: $DIR/$FILE\n*************&quot;
# Se è una dir ci entro dentro e chiamo la ricorsione
      cd $FILE
      chstr_ric &quot;$1&quot; &quot;$2&quot; &quot;$FILE&quot;
      echo -e &quot;\n*************\nEsco da a: $DIR/$FILE\n*************&quot;
# finita la ricorsione risalgo nell albero delle directory
      cd ..
    else
      echo -e &quot;\tProcesso il file: $FILE&quot;
# se è un file attuo la sostituzione
      sed -e &quot;s/$1/$2/g&quot; $FILE &gt; $FILE.newsed
      mv -f $FILE.newsed $FILE
    fi
  done
}
</pre>

<p>Come prima cosa verifica il terzo parametro, e se è presente lo considera come directory di partenza. Se non presente setta come directory iniziale quella attuale. A questo punto scorre tutti i file presenti all'interno e:
<ul>
	<li>Se si tratta di un file esegue la sostituzione usando sed ed un file temporaneo.</li>
	<li>Se si tratta di una directory richiama ricorsivamente se stessa con la directory in questione come terzo parametro.</li>
</ul>
Lo script completo è scaricabile <a title="subst.sh" href="/download/subst.sh">qui</a>.<p/>]]></content:encoded>
			<wfw:commentRss>http://gabo.homelinux.com/2009/02/sostituzione-ricorsiva-di-regular-expression/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Find</title>
		<link>http://gabo.homelinux.com/2009/02/find/</link>
		<comments>http://gabo.homelinux.com/2009/02/find/#comments</comments>
		<pubDate>Thu, 26 Feb 2009 08:31:49 +0000</pubDate>
		<dc:creator>gabo</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[find]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://gabo.homelinux.com/?p=35</guid>
		<description><![CDATA[Non so voi, ma io faccio una fatica tremenda a ricordarmi alcuni semplici ed utili comandi linux. Con questo articolo voglio iniziare una serie di promemoria in cui me li appunto, così so dove andarli a cercare. È finita l'era del txt disperso sui miei HDD, ora c'ho il blog!!!

Per cercare tutti i file con [...]]]></description>
			<content:encoded><![CDATA[Non so voi, ma io faccio una fatica tremenda a ricordarmi alcuni semplici ed utili comandi linux. Con questo articolo voglio iniziare una serie di promemoria in cui me li appunto, così so dove andarli a cercare. È finita l'era del txt disperso sui miei HDD, ora c'ho il blog!!!

Per cercare tutti i file con una determinata estensione:

<pre class="brush: bash;">
find /home/gabo -name &quot;*.txt&quot;
</pre>Per cercare tutti i file contenenti una determinata stringa.

<pre class="brush: bash;">
find /home/gabo | xargs grep -i &quot;frase da cercare&quot;
</pre>Per cancellare ricorsivamente tutti i file di un certo tipo (utile per rimuover i file di backup dai server di produzione, dopo upload errati)

<pre class="brush: bash;">
find . -name '*~' -exec rm -f {} \;
</pre>]]></content:encoded>
			<wfw:commentRss>http://gabo.homelinux.com/2009/02/find/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
