<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Aldolat.it &#8212; Post con tag Terminale</title>
        <link>https://www.aldolat.it/tags/terminale/</link>
        <description>Ultimi post pubblicati nel tag Terminale &#8212; aldolat.it</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>it</language>
        <managingEditor>aldolat@gmail.com (Aldo Latino)</managingEditor>
        <webMaster>aldolat@gmail.com (Aldo Latino)</webMaster>
        <copyright>Creative Commons BY-SA 4.0</copyright>
        <lastBuildDate>Sun, 14 Jun 2026 19:12:47 +0200</lastBuildDate>
        <atom:link href="https://www.aldolat.it/tags/terminale/index.xml" rel="self" type="application/rss+xml" />
        <item>
            <title>Rimuovere oggetti da PDF con Inkscape via terminale</title>
            <link>https://www.aldolat.it/posts/2025/rimuovere-oggetti-pdf-inkscape-terminale/</link>
            <pubDate>Wed, 06 Aug 2025 09:26:12 +0200</pubDate>
            <author>aldolat@gmail.com (Aldo Latino)</author>
            <guid>https://www.aldolat.it/posts/2025/rimuovere-oggetti-pdf-inkscape-terminale/</guid>
            <description>Avete uno o mille PDF e in tutti ci sono uno o più livelli e oggetti che bisogna rimuovere. Una soluzione possibile è usare Inkscape, ma da terminale. In questo post racconto come, grazie a un piccolo script, siamo riusciti a portare a termine un&#39;operazione che altrimenti avrebbe richiesto un sacco di tempo.</description>
            <content:encoded>Avete uno o mille PDF e in tutti ci sono uno o più livelli e oggetti che bisogna rimuovere. Una soluzione possibile è usare Inkscape, ma da terminale. In questo post racconto come, grazie a un piccolo script, siamo riusciti a portare a termine un&#39;operazione che altrimenti avrebbe richiesto un sacco di tempo.&lt;p&gt;* * *&lt;/p&gt;&lt;p class=&#34;dc3&#34;&gt;C&lt;span class=&#34;allsc&#34;&gt;i è capitato&lt;/span&gt; in questi giorni di mandare in stampa&#xA;presso un servizio specializzato online un &lt;span class=&#34;allsc&#34;&gt;PDF&lt;/span&gt; con&#xA;alcuni appunti. Così com&amp;rsquo;era, però, il file non veniva accettato perché&#xA;presentava uno sfondo giallo chiaro su tutte le pagine. O, per meglio dire, la&#xA;stampa sarebbe costata di più. Poiché non posso pubblicare lo screenshot di una&#xA;pagina reale, vi basti questa ricostruzione di fantasia che però rende l&amp;rsquo;idea di&#xA;cosa avevamo davanti:&lt;/p&gt;&#xA;&lt;figure class=&#34;aligncenter color nobg&#34;&gt;&lt;img src=&#34;https://www.aldolat.it/images/2025/08/pdf-bg.webp&#34;&#xA;&#x9;&#x9;&#x9;alt=&#34;Figura 1. Un esempio di pagina con lo sfondo giallo chiaro da rimuovere.&#34; width=&#34;690&#34; height=&#34;431&#34;&gt;&lt;figcaption&gt;&#xA;&#x9;&#x9;&#x9;&lt;p&gt;&lt;em&gt;Figura 1&lt;/em&gt;. Un esempio di pagina con lo sfondo giallo chiaro da rimuovere.&lt;/p&gt;&#xA;&#x9;&#x9;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;Il &lt;span class=&#34;allsc&#34;&gt;PDF&lt;/span&gt; è composto da 358 pagine: come fare per rimuovere&#xA;quello sfondo colorato, lasciando intatto tutto il resto?&lt;/p&gt;&#xA;&lt;p&gt;La prima soluzione che mi è venuta in mente era di estrarre singolarmente le&#xA;pagine dal &lt;span class=&#34;allsc&#34;&gt;PDF&lt;/span&gt; e darle in pasto a ImageMagick,&#xA;dicendogli di applicare una correzione dei livelli di colore in modo da&#xA;eliminare lo sfondo. Ma abbiamo scartato subito questa ipotesi perché il file&#xA;risultante, composto interamente da immagini raster, sarebbe stato enorme.&lt;/p&gt;&#xA;&lt;p&gt;Mi viene un&amp;rsquo;idea. Se i file sono vettoriali (cosa che ancora non sapevamo) e se&#xA;lo sfondo giallo chiaro sta su un suo livello separato o, per meglio dire, è un&#xA;oggetto separato da tutti gli altri, forse possiamo eliminarlo. Apriamo una&#xA;pagina con Inkscape e scopriamo che i file sono effettivamente vettoriali e che&#xA;lo sfondo è un oggetto separato, chiamato &lt;code&gt;path1&lt;/code&gt; (vedi fig. 2). Ma non solo:&#xA;scopriamo anche che i quadretti (che avremmo desiderato pure togliere) stanno&#xA;tutti assieme in un gruppo chiamato &lt;code&gt;g27514&lt;/code&gt;, quindi un facile obiettivo per la&#xA;rimozione di massa.&lt;/p&gt;&#xA;&lt;figure class=&#34;aligncenter color nobg&#34;&gt;&lt;img src=&#34;https://www.aldolat.it/images/2025/08/oggetti-inkscape-pag-62.webp&#34;&#xA;&#x9;&#x9;&#x9;alt=&#34;Figura 2. I due oggetti di pagina 62, indicati dalla freccia, contenenti lo sfondo e i quadretti. In Inkscape è attualmente aperto un file PDF composto da due pagine.&#34; width=&#34;690&#34; height=&#34;478&#34;&gt;&lt;figcaption&gt;&#xA;&#x9;&#x9;&#x9;&lt;p&gt;&lt;em&gt;Figura 2&lt;/em&gt;. I due oggetti di pagina 62, indicati dalla freccia, contenenti lo sfondo e i quadretti. In Inkscape è attualmente aperto un file PDF composto da due pagine.&lt;/p&gt;&#xA;&#x9;&#x9;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;Questi nomi di oggetti, per ovvie ragioni, non vengono mantenuti se apriamo con&#xA;Inkscape più pagine del &lt;span class=&#34;allsc&#34;&gt;PDF&lt;/span&gt;. Nella figura 2, ad esempio,&#xA;abbiamo aperto con Inkscape due pagine, cioè la 62 e la 63: come si vede&#xA;dall&amp;rsquo;immagine, lo sfondo della prima pagina (la 62) si chiama &lt;code&gt;path1&lt;/code&gt;, così come&#xA;il gruppo dei quadretti si chiama &lt;code&gt;g27514&lt;/code&gt;, ma non così dalla seconda pagina (la&#xA;63, vedi fig. 3) in poi, perché questi nomi sono, nel nostro caso, anche degli&#xA;&lt;span class=&#34;allsc&#34;&gt;ID&lt;/span&gt; che devono identificare univocamente un oggetto.&lt;/p&gt;&#xA;&lt;figure class=&#34;aligncenter color nobg&#34;&gt;&lt;img src=&#34;https://www.aldolat.it/images/2025/08/oggetti-inkscape-pag-63.webp&#34;&#xA;&#x9;&#x9;&#x9;alt=&#34;Figura 3. I due stessi oggetti ma di pagina 63, con nomi diversi rispetto alla pagina precedente.&#34; width=&#34;690&#34; height=&#34;478&#34;&gt;&lt;figcaption&gt;&#xA;&#x9;&#x9;&#x9;&lt;p&gt;&lt;em&gt;Figura 3&lt;/em&gt;. I due stessi oggetti ma di pagina 63, con nomi diversi rispetto alla pagina precedente.&lt;/p&gt;&#xA;&#x9;&#x9;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;Proviamo quindi a dividere il file &lt;span class=&#34;allsc&#34;&gt;PDF&lt;/span&gt; di 358 pagine in&#xA;tanti file quante sono le sue pagine e a verificare se gli &lt;span class=&#34;allsc&#34;&gt;ID&lt;/span&gt; dello sfondo e del gruppo vengono sempre mantenuti: sì, vengono&#xA;mantenuti! A qusto punto siamo pronti per mettere all&amp;rsquo;opera Inkscape, ma non per&#xA;via grafica, che comporterebbe un sacco di tempo e un incredibile mal di testa,&#xA;ma da terminale.&lt;/p&gt;&#xA;&lt;h2 id=&#34;estrazione-delle-pagine-dal-pdf&#34;&gt;Estrazione delle pagine dal pdf&lt;/h2&gt;&#xA;&lt;p&gt;La prima operazione è, quindi, quella di suddividere l&amp;rsquo;intero &lt;span class=&#34;allsc&#34;&gt;PDF&lt;/span&gt; in 358 file, cioè un file per ogni pagina:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pdftk input.pdf burst&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;rimozione-degli-oggetti&#34;&gt;Rimozione degli oggetti&lt;/h2&gt;&#xA;&lt;p&gt;Mettiamo ora mano alla creazione di uno script Bash semplicissimo che processi&#xA;tutti i &lt;span class=&#34;allsc&#34;&gt;PDF&lt;/span&gt; di una directory mediante Inkscape. Ci siamo&#xA;dovuti spulciare il manuale di Inkscape (&lt;code&gt;man inkscape&lt;/code&gt;) per capire quali&#xA;comandi (che lui chiama &lt;em&gt;actions&lt;/em&gt;) potevano fare al caso nostro. Quello che è&#xA;venuto fuori è questo script:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight wrap&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 1&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#!/bin/bash&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 2&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Script per rimuovere oggetti da un PDF tramite ID.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 3&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 4&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;OBJECT_TO_REMOVE1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;path1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 5&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;OBJECT_TO_REMOVE2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;g27514&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 6&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 7&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;mkdir -p modified&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 8&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 9&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; pdf in *.pdf&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Processo: &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$pdf&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;11&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;12&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;  inkscape --actions&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;select-by-id:&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$OBJECT_TO_REMOVE1&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;13&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;  delete-selection;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;  select-by-id:&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$OBJECT_TO_REMOVE2&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;15&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;  delete-selection;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;16&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;  export-filename:modified/&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$pdf&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;  export-do&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$pdf&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &amp;gt; /dev/null 2&amp;gt;&lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;18&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;19&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Completato: modified/&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$pdf&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;20&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dopo aver definito gli &lt;span class=&#34;allsc&#34;&gt;ID&lt;/span&gt; dei due oggetti da rimuovere&#xA;(righe 4 e 5), lo script, per ogni &lt;span class=&#34;allsc&#34;&gt;PDF&lt;/span&gt; che trova, esegue&#xA;il comando &lt;code&gt;inkscape&lt;/code&gt; con alcune azioni in sequenza:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;seleziona il primo oggetto per &lt;span class=&#34;allsc&#34;&gt;ID&lt;/span&gt;;&lt;/li&gt;&#xA;&lt;li&gt;elimina l&amp;rsquo;oggetto selezionato;&lt;/li&gt;&#xA;&lt;li&gt;seleziona il secondo oggetto per &lt;span class=&#34;allsc&#34;&gt;ID&lt;/span&gt;;&lt;/li&gt;&#xA;&lt;li&gt;elimina l&amp;rsquo;oggetto selezionato;&lt;/li&gt;&#xA;&lt;li&gt;imposta il nome del file da esportare;&lt;/li&gt;&#xA;&lt;li&gt;esegue l&amp;rsquo;esportazione.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Infine, abbiamo anche reindirizzato l&amp;rsquo;output su &lt;code&gt;/dev/null&lt;/code&gt; per evitare di&#xA;vedere un sacco di righe inutili al nostro scopo e, una volta salvato il file,&#xA;stampa a video il messaggio di conclusione per quel singolo file.&lt;/p&gt;&#xA;&lt;p class=&#34;newpar&#34;&gt;Questo è il risultato di una pagina dopo l&amp;rsquo;esecuzione dello script:&lt;/p&gt;&#xA;&lt;figure class=&#34;aligncenter color nobg&#34;&gt;&lt;img src=&#34;https://www.aldolat.it/images/2025/08/pdf-nobg.webp&#34;&#xA;&#x9;&#x9;&#x9;alt=&#34;Figura 4. Un esempio di pagina senza lo sfondo giallo né i quadretti.&#34; width=&#34;690&#34; height=&#34;431&#34;&gt;&lt;figcaption&gt;&#xA;&#x9;&#x9;&#x9;&lt;p&gt;&lt;em&gt;Figura 4&lt;/em&gt;. Un esempio di pagina senza lo sfondo giallo né i quadretti.&lt;/p&gt;&#xA;&#x9;&#x9;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;h2 id=&#34;riunione-finale-delle-pagine-in-un-unico-file&#34;&gt;Riunione finale delle pagine in un unico file&lt;/h2&gt;&#xA;&lt;p&gt;Per riunire, alla fine, tutti i &lt;span class=&#34;allsc&#34;&gt;PDF&lt;/span&gt; basta dare:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pdftk modified/*.pdf cat output pdf_finale.pdf&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr class=&#34;decorative&#34;&gt;&#xA;&#xA;&lt;p&gt;Con poche righe di Bash e gli strumenti giusti, abbiamo risolto un problema&#xA;concreto in poco tempo: è stata necessaria un&amp;rsquo;ora per il mio vecchissimo PC per&#xA;fare questo lavoro. Il &lt;a href=&#34;https://www.aldolat.it/tags/terminale/&#34;&gt;terminale&lt;/a&gt;, ancora una volta, si&#xA;dimostra uno strumento insostituibile per chi lavora con tanti file. E ancora,&#xA;dopo vent&amp;rsquo;anni d&amp;rsquo;uso di Linux, riesco a meravigliarmi per quello che abbiamo a&#xA;disposizione!&lt;/p&gt;&#xA;&lt;p&gt;L&#39;articolo &lt;a href=&#34;https://www.aldolat.it/posts/2025/rimuovere-oggetti-pdf-inkscape-terminale/&#34;&gt;Rimuovere oggetti da PDF con Inkscape via terminale&lt;/a&gt; è uno scritto di &lt;a href=&#34;https://www.aldolat.it/&#34;&gt;aldolat.it&lt;/a&gt;. Rispettane le &lt;a href=&#34;https://www.aldolat.it/info/#licenza&#34;&gt;condizioni di licenza&lt;/a&gt;.&lt;/p&gt;</content:encoded>
        </item>
        <item>
            <title>Concatenare più file CSV</title>
            <link>https://www.aldolat.it/posts/2024/concatenare-piu-file-csv/</link>
            <pubDate>Sat, 19 Oct 2024 09:31:07 +0200</pubDate>
            <author>aldolat@gmail.com (Aldo Latino)</author>
            <guid>https://www.aldolat.it/posts/2024/concatenare-piu-file-csv/</guid>
            <description>Concatenare molti file CSV, tenendo l&#39;intestazione dei dati una volta sola, può essere un incubo, ma con Linux è molto semplice farlo.</description>
            <content:encoded>Concatenare molti file CSV, tenendo l&#39;intestazione dei dati una volta sola, può essere un incubo, ma con Linux è molto semplice farlo.&lt;p&gt;* * *&lt;/p&gt;&lt;p class=&#34;dc&#34;&gt;U&lt;span class=&#34;allsc&#34;&gt;ltimamente ho&lt;/span&gt; avuto l&amp;rsquo;esigenza di unire tantissimi file di testo in formato&#xA;&lt;code&gt;.csv&lt;/code&gt; in modo da poterli riutilizzare altrove.&#xA;Ogni file era composto da una riga di intestazione e dai dati a seguire. La mia&#xA;esigenza era di unirli tutti assieme, mettendo un&amp;rsquo;unica intestazione con tutti i&#xA;dati dopo di essa. Come si possono unire 622 file in questo modo con Linux?&lt;/p&gt;&#xA;&lt;h2 id=&#34;la-situazione&#34;&gt;La situazione&lt;/h2&gt;&#xA;&lt;p&gt;Supponiamo che stiamo lavorando col terminale dentro la directory &lt;code&gt;job&lt;/code&gt; e che i&#xA;file &lt;code&gt;.csv&lt;/code&gt; siano in una sotto-directory chiamata &lt;code&gt;dati&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;job/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── dati&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   ├── file-001.csv&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   ├── file-002.csv&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   ├── file-003.csv&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   ├── ...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ogni file &lt;code&gt;.csv&lt;/code&gt; è composto così:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;LOCALITA;DATA;TMEDIA °C;TMIN °C;TMAX °C;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Roma;1/5/2010;&amp;#34;17&amp;#34;;&amp;#34;10&amp;#34;;&amp;#34;22&amp;#34;;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Roma;2/5/2010;&amp;#34;17&amp;#34;;&amp;#34;13&amp;#34;;&amp;#34;21&amp;#34;;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Roma;3/5/2010;&amp;#34;18&amp;#34;;&amp;#34;16&amp;#34;;&amp;#34;21&amp;#34;;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La prima riga è l&amp;rsquo;intestazione, le successive i dati veri e propri. L&amp;rsquo;idea è&#xA;quella di prelevare la riga di intestazione dal primo file e successivamente di&#xA;prelevare tutte le righe da tutti i file, escludendo però la prima riga, che&#xA;abbiamo già prelevato e che è identica in ogni file. Per il nostro scopo&#xA;possiamo usare &lt;code&gt;head&lt;/code&gt; e &lt;code&gt;tail&lt;/code&gt;, in un unico comando.&lt;/p&gt;&#xA;&lt;h2 id=&#34;il-comando&#34;&gt;Il comando&lt;/h2&gt;&#xA;&lt;p&gt;Il glorioso ed efficiente comando è:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;head -n &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; dati/file-001.csv &amp;gt; unito.csv &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; tail -n+2 -q dati/*.csv &amp;gt;&amp;gt; unito.csv&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vediamolo nel dettaglio. Il comando è composto da due comandi distinti:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;head ... &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; tail ...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Il primo comando (&lt;code&gt;head -n 1&lt;/code&gt;) preleva dal primo file (ma potrebbe essere&#xA;qualunque file, visto che tutti hanno la stessa intestazione dati) la riga di&#xA;intestazione e la scrive nel file &lt;code&gt;unito.csv&lt;/code&gt; dentro la directory &lt;code&gt;job&lt;/code&gt;,&#xA;esternamente quindi alla directory &lt;code&gt;dati&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Il secondo (&lt;code&gt;tail -n+2&lt;/code&gt;) preleva da tutti file &lt;code&gt;.csv&lt;/code&gt; tutte le righe a partire&#xA;dalla seconda e le accoda al file &lt;code&gt;unito.csv&lt;/code&gt;. Il parametro &lt;code&gt;-q&lt;/code&gt; dice a &lt;code&gt;tail&lt;/code&gt;&#xA;di non scrivere, prima di ogni blocco di testo accodato nel file &lt;code&gt;unito.csv&lt;/code&gt;, la&#xA;riga da cui ha prelevato il blocco stesso. Se togliessimo &lt;code&gt;-q&lt;/code&gt; il risultato&#xA;sarebbe qualcosa del tipo:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;LOCALITA;DATA;TMEDIA °C;TMIN °C;TMAX °C;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;==&amp;gt; dati_meteo_roma/2010_05_Maggio_roma.csv &amp;lt;==&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Roma;1/5/2010;&amp;#34;17&amp;#34;;&amp;#34;10&amp;#34;;&amp;#34;22&amp;#34;;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Roma;2/5/2010;&amp;#34;17&amp;#34;;&amp;#34;13&amp;#34;;&amp;#34;21&amp;#34;;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Roma;3/5/2010;&amp;#34;18&amp;#34;;&amp;#34;16&amp;#34;;&amp;#34;21&amp;#34;;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;==&amp;gt; dati_meteo_roma/2010_06_Giugno_roma.csv &amp;lt;==&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Roma;1/6/2010;&amp;#34;18&amp;#34;;&amp;#34;13&amp;#34;;&amp;#34;23&amp;#34;;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Roma;2/6/2010;&amp;#34;18&amp;#34;;&amp;#34;15&amp;#34;;&amp;#34;23&amp;#34;;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Roma;3/6/2010;&amp;#34;17&amp;#34;;&amp;#34;11&amp;#34;;&amp;#34;22&amp;#34;;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Con il parametro &lt;code&gt;-q&lt;/code&gt;, invece, i dati saranno posti uno sotto l&amp;rsquo;altro:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;LOCALITA;DATA;TMEDIA °C;TMIN °C;TMAX °C;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Roma;1/5/2010;&amp;#34;17&amp;#34;;&amp;#34;10&amp;#34;;&amp;#34;22&amp;#34;;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Roma;2/5/2010;&amp;#34;17&amp;#34;;&amp;#34;13&amp;#34;;&amp;#34;21&amp;#34;;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Roma;3/5/2010;&amp;#34;18&amp;#34;;&amp;#34;16&amp;#34;;&amp;#34;21&amp;#34;;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Roma;30/5/2010;&amp;#34;22&amp;#34;;&amp;#34;16&amp;#34;;&amp;#34;27&amp;#34;;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Roma;31/5/2010;&amp;#34;20&amp;#34;;&amp;#34;16&amp;#34;;&amp;#34;25&amp;#34;;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Roma;1/6/2010;&amp;#34;18&amp;#34;;&amp;#34;13&amp;#34;;&amp;#34;23&amp;#34;;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Roma;2/6/2010;&amp;#34;18&amp;#34;;&amp;#34;15&amp;#34;;&amp;#34;23&amp;#34;;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Roma;3/6/2010;&amp;#34;17&amp;#34;;&amp;#34;11&amp;#34;;&amp;#34;22&amp;#34;;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Quanto tempo e lavoro sarebbe stato necessario se avessimo dovuto farlo&#xA;manualmente?&lt;/p&gt;&#xA;&lt;p&gt;L&#39;articolo &lt;a href=&#34;https://www.aldolat.it/posts/2024/concatenare-piu-file-csv/&#34;&gt;Concatenare più file CSV&lt;/a&gt; è uno scritto di &lt;a href=&#34;https://www.aldolat.it/&#34;&gt;aldolat.it&lt;/a&gt;. Rispettane le &lt;a href=&#34;https://www.aldolat.it/info/#licenza&#34;&gt;condizioni di licenza&lt;/a&gt;.&lt;/p&gt;</content:encoded>
        </item>
        <item>
            <title>Cancellare righe con sed</title>
            <link>https://www.aldolat.it/posts/2022/cancellare-righe-con-sed/</link>
            <pubDate>Tue, 26 Apr 2022 20:55:01 +0200</pubDate>
            <author>aldolat@gmail.com (Aldo Latino)</author>
            <guid>https://www.aldolat.it/posts/2022/cancellare-righe-con-sed/</guid>
            <description>Nel processo di migrazione a Hugo dovevo modificare in tantissimi file di testo alcune righe, un po&amp;rsquo; come già successo qui. Oggi dovevo cancellare dal Front matter alcune righe. Un lavoro noiosissimo da fare a mano.&#xA;Cancellare una riga soltanto Dovevo cancellare la riga contenente questa stringa:&#xA;url: /vecchio/indirizzo/da/cancellare Mi è bastato questo comando di sed:&#xA;sed -i &amp;#39;/url:/d&amp;#39; *.md Cancellare una riga e la successiva In questo caso la situazione è un po&amp;rsquo; più complessa. Le righe da cancellare erano queste due:</description>
            <content:encoded>&lt;p class=&#34;dc&#34;&gt;N&lt;span class=&#34;allsc&#34;&gt;el processo&lt;/span&gt; di migrazione a Hugo dovevo modificare in tantissimi file di testo alcune righe, un po&amp;rsquo; come già successo &lt;a href=&#34;https://www.aldolat.it/posts/2022/cambiare-stringa-molti-file-testo/&#34;&gt;qui&lt;/a&gt;. Oggi dovevo cancellare dal &lt;em&gt;Front matter&lt;/em&gt; alcune righe. Un lavoro noiosissimo da fare a mano.&lt;/p&gt;&#xA;&lt;h2 id=&#34;cancellare-una-riga-soltanto&#34;&gt;Cancellare una riga soltanto&lt;/h2&gt;&#xA;&lt;p&gt;Dovevo cancellare la riga contenente questa stringa:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;url: /vecchio/indirizzo/da/cancellare&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Mi è bastato questo comando di &lt;code&gt;sed&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sed -i &lt;span class=&#34;s1&#34;&gt;&amp;#39;/url:/d&amp;#39;&lt;/span&gt; *.md&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;cancellare-una-riga-e-la-successiva&#34;&gt;Cancellare una riga e la successiva&lt;/h2&gt;&#xA;&lt;p&gt;In questo caso la situazione è un po&amp;rsquo; più complessa. Le righe da cancellare erano queste due:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;dsq_thread_id:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  - 123456789&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Come si vede, bisognava cancellare ben due righe. Anche in questo caso &lt;code&gt;sed&lt;/code&gt; mi è stato di prezioso aiuto. Questo programma, tra le sue funzioni, ha proprio quella di cancellare una riga corrispondente a quello che si cerca &lt;em&gt;più la successiva&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Ecco quindi il glorioso comando:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sed -i &lt;span class=&#34;s1&#34;&gt;&amp;#39;/dsq_thread_id/{N;d;}&amp;#39;&lt;/span&gt; *.md&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Anche in questo caso non credo ci sia bisogno di spiegazioni.&lt;/p&gt;&#xA;&lt;p&gt;L&#39;articolo &lt;a href=&#34;https://www.aldolat.it/posts/2022/cancellare-righe-con-sed/&#34;&gt;Cancellare righe con sed&lt;/a&gt; è uno scritto di &lt;a href=&#34;https://www.aldolat.it/&#34;&gt;aldolat.it&lt;/a&gt;. Rispettane le &lt;a href=&#34;https://www.aldolat.it/info/#licenza&#34;&gt;condizioni di licenza&lt;/a&gt;.&lt;/p&gt;</content:encoded>
        </item>
        <item>
            <title>Cambiare una stringa in molti file di testo</title>
            <link>https://www.aldolat.it/posts/2022/cambiare-stringa-molti-file-testo/</link>
            <pubDate>Sun, 03 Apr 2022 16:45:03 +0200</pubDate>
            <author>aldolat@gmail.com (Aldo Latino)</author>
            <guid>https://www.aldolat.it/posts/2022/cambiare-stringa-molti-file-testo/</guid>
            <description>Oggi dovevo modificare tutta una serie di file di testo, cambiando una semplice parola (excerpt:) in un&amp;rsquo;altra (description:). È bastato sed:&#xA;sed -i &amp;#39;s/excerpt:/description:/g&amp;#39; *</description>
            <content:encoded>&lt;p class=&#34;dch3&#34;&gt;O&lt;span class=&#34;allsc&#34;&gt;ggi dovevo&lt;/span&gt; modificare tutta una serie di file di testo, cambiando una semplice parola (&lt;code&gt;excerpt:&lt;/code&gt;) in un&amp;rsquo;altra (&lt;code&gt;description:&lt;/code&gt;). È bastato &lt;code&gt;sed&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sed -i &lt;span class=&#34;s1&#34;&gt;&amp;#39;s/excerpt:/description:/g&amp;#39;&lt;/span&gt; *&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;L&#39;articolo &lt;a href=&#34;https://www.aldolat.it/posts/2022/cambiare-stringa-molti-file-testo/&#34;&gt;Cambiare una stringa in molti file di testo&lt;/a&gt; è uno scritto di &lt;a href=&#34;https://www.aldolat.it/&#34;&gt;aldolat.it&lt;/a&gt;. Rispettane le &lt;a href=&#34;https://www.aldolat.it/info/#licenza&#34;&gt;condizioni di licenza&lt;/a&gt;.&lt;/p&gt;</content:encoded>
        </item>
        <item>
            <title>Cambiare i permessi a file e directory ricorsivamente</title>
            <link>https://www.aldolat.it/posts/2009/cambiare-i-permessi-a-file-e-directory-ricorsivamente/</link>
            <pubDate>Sun, 21 Jun 2009 09:40:30 +0000</pubDate>
            <author>aldolat@gmail.com (Aldo Latino)</author>
            <guid>https://www.aldolat.it/posts/2009/cambiare-i-permessi-a-file-e-directory-ricorsivamente/</guid>
            <description>Con l&amp;rsquo;operazione effettuata ieri, ho guadagnato un sacco di spazio dove poter mettere una serie complessa (ma rigorosamente ordinata) di directory e file. Questa serie l&amp;rsquo;ho prelevata da un vecchio backup su un disco fisso esterno e tutti i permessi erano in 777. Di ripristinare da GUI i permessi corretti non se ne parlava proprio (sono diventato molto pigro, ultimamente&amp;hellip;) per cui mi sono cercato il modo per farlo da terminale.</description>
            <content:encoded>&lt;figure class=&#34;aligncenter&#34;&gt;&lt;img src=&#34;https://www.aldolat.it/images/2009/06/archivist.jpg&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;Con &lt;a href=&#34;https://www.aldolat.it/posts/2009/gparted-rocks-co-starring-dire-straits/&#34;&gt;l&amp;rsquo;operazione effettuata ieri&lt;/a&gt;, ho guadagnato un sacco di spazio dove poter mettere una serie complessa (ma rigorosamente ordinata) di directory e file. Questa serie l&amp;rsquo;ho prelevata da un vecchio backup su un disco fisso esterno e tutti i permessi erano in &lt;code&gt;777&lt;/code&gt;. Di ripristinare da GUI i permessi corretti non se ne parlava proprio (sono diventato molto pigro, ultimamente&amp;hellip;) per cui mi sono cercato il modo per farlo da terminale.&lt;/p&gt;&#xA;&lt;p&gt;I permessi dovevano essere &lt;code&gt;755&lt;/code&gt; per le directory e &lt;code&gt;644&lt;/code&gt; per i file. Il comando&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod &lt;span class=&#34;m&#34;&gt;755&lt;/span&gt; -R *&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;non fa distinzione tra file e directory e cambia indistintamente i permessi a ogni cosa; neanche la sintassi&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod &lt;span class=&#34;m&#34;&gt;644&lt;/span&gt; -R *.txt&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ci aiuta perché si ferma solo alla directory dove viene eseguito. Probabilmente con una pipe si potrebbe fare, ma non ho approfondito.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;Il comando che mi ha aiutato in una frazione di secondo è &lt;code&gt;find&lt;/code&gt; (da GUI avrei impiegato qualche ora). Nelle pagine di manuale addirittura è riportato espressamente il comando che serve in questo caso:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;find . -type f -exec file &lt;span class=&#34;s1&#34;&gt;&amp;#39;{}&amp;#39;&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;;&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;che nel mio caso diventa&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;find . -type f -exec chmod &lt;span class=&#34;m&#34;&gt;644&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;{}&amp;#39;&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;;&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vediamo di capire cosa stiamo dicendo al sistema:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;trovami (&lt;code&gt;find&lt;/code&gt;) in questa directory (&lt;code&gt;.&lt;/code&gt;)&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; tutti gli oggetti di tipo file (&lt;code&gt;-type f&lt;/code&gt;) quindi esegui il comando (&lt;code&gt;-exec&lt;/code&gt;) &lt;code&gt;chmod 644&lt;/code&gt; a ciò che hai trovato (&lt;code&gt;&#39;{}&#39; &#39;;&#39;&lt;/code&gt;)&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Per le directory il comando cambia in questo modo:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;find . -type d -exec chmod &lt;span class=&#34;m&#34;&gt;755&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;{}&amp;#39;&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;;&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Io rimango sempre meravigliato della potenza del terminale, non so voi&amp;hellip;&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;Magari Shaytan di &lt;a href=&#34;http://www.linuxedintorni.org/&#34;&gt;Linux e dintorni&lt;/a&gt; ci saprebbe dire di più.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;E &lt;code&gt;find&lt;/code&gt; va anche nelle sottodirectory.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:3&#34;&gt;&#xA;&lt;p&gt;Da notare le virgolette singole che forzano il sistema a non interpretare quei simboli come punteggiatura. Il punto e virgola finale chiude gli argomenti per il comando eseguito (&lt;code&gt;chmod&lt;/code&gt;). Si potrebbe usare al posto delle virgolette anche il backslash, per cui il comando verrebbe:&lt;br&gt;&#xA;&lt;code&gt;find . -type f -exec chmod 644 \{\} \;&lt;/code&gt;&lt;br&gt;&#xA;Come mi aspettavo, alcuni lettori del blog hanno inviato nei commenti altri metodi per fare la stessa cosa. Li riporto qui e li ringrazio per il prezioso contributo:&lt;br&gt;&#xA;&amp;mdash; fazen suggerisce: &lt;code&gt;find . -type f -print0 | xargs -0 chmod 644 find . -type d -print0 | xargs -0 chmod 755&lt;/code&gt;&lt;br&gt;&#xA;&amp;mdash; CDF suggerisce: &lt;code&gt;chmod -R u=rw,go=r,+X .&lt;/code&gt;&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;L&#39;articolo &lt;a href=&#34;https://www.aldolat.it/posts/2009/cambiare-i-permessi-a-file-e-directory-ricorsivamente/&#34;&gt;Cambiare i permessi a file e directory ricorsivamente&lt;/a&gt; è uno scritto di &lt;a href=&#34;https://www.aldolat.it/&#34;&gt;aldolat.it&lt;/a&gt;. Rispettane le &lt;a href=&#34;https://www.aldolat.it/info/#licenza&#34;&gt;condizioni di licenza&lt;/a&gt;.&lt;/p&gt;</content:encoded>
        </item>
        <item>
            <title>Archiviazione e compressione in Linux</title>
            <link>https://www.aldolat.it/posts/2008/archiviazione-e-compressione-in-linux/</link>
            <pubDate>Sat, 13 Dec 2008 21:15:23 +0000</pubDate>
            <author>aldolat@gmail.com (Aldo Latino)</author>
            <guid>https://www.aldolat.it/posts/2008/archiviazione-e-compressione-in-linux/</guid>
            <description>Ormai con Ubuntu comprimere una cartella o più file in un archivio è una cosa semplicissima: clic destro e via. Ma sicuramente chi usa GNU/Linux non si ferma all&amp;rsquo;immediatezza dell&amp;rsquo;operazione, ma vuole andare a fondo e capire cosa succede quando si fa clic sulla voce di menu Crea archivio&amp;hellip;&#xA;Anzitutto bisogna distinguere tra archiviazione e compressione. L&amp;rsquo;archiviazione consente di raccogliere senza comprimerli tanti file in uno unico, in modo da consentire una trasportabilità più comoda e veloce (una cosa è trasportare diecimila file che pesano 5 mega e una cosa è trasportare un file che pesa 5 mega). La compressione, invece, rende addirittura più piccolo il file d&amp;rsquo;archivio e dunque assicura una velocità di trasferimento ancora maggiore.</description>
            <content:encoded>&lt;figure class=&#34;aligncenter&#34;&gt;&lt;img src=&#34;https://www.aldolat.it/images/2008/12/man_briefcase.jpg&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p class=&#34;dc&#34;&gt;O&lt;span class=&#34;allsc&#34;&gt;rmai con Ubuntu&lt;/span&gt; comprimere una cartella o più file in un archivio è una cosa semplicissima: clic destro e via. Ma sicuramente chi usa GNU/Linux non si ferma all&amp;rsquo;immediatezza dell&amp;rsquo;operazione, ma vuole andare a fondo e capire cosa succede quando si fa clic sulla voce di menu &lt;em&gt;Crea archivio&amp;hellip;&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Anzitutto bisogna distinguere tra &lt;em&gt;archiviazione&lt;/em&gt; e &lt;em&gt;compressione&lt;/em&gt;. L&amp;rsquo;archiviazione consente di raccogliere senza comprimerli tanti file in uno unico, in modo da consentire una trasportabilità più comoda e veloce (una cosa è trasportare &lt;em&gt;diecimila file che pesano 5 mega&lt;/em&gt; e una cosa è trasportare &lt;em&gt;un file che pesa 5 mega&lt;/em&gt;). La compressione, invece, rende addirittura più piccolo il file d&amp;rsquo;archivio e dunque assicura una velocità di trasferimento ancora maggiore.&lt;/p&gt;&#xA;&lt;h2 id=&#34;archiviare-file-e-cartelle&#34;&gt;Archiviare file e cartelle&lt;/h2&gt;&#xA;&lt;p&gt;Archiviare i file (mettere tanti file in un unico file) è un po&amp;rsquo; come metterli in una cartella, col vantaggio però di avere come risultato un file singolo. Lo strumento usato su Linux per fare questa operazione è &lt;code&gt;tar&lt;/code&gt;, un acronimo di &amp;ldquo;&lt;code&gt;t&lt;/code&gt;ape &lt;code&gt;ar&lt;/code&gt;chive&amp;rdquo;. Un aspetto importante di &lt;code&gt;tar&lt;/code&gt; è che con l&amp;rsquo;archiviazione non si perdono le informazioni dei file, come data e ora, utente, gruppo, permessi e struttura delle cartelle.&lt;/p&gt;&#xA;&lt;p&gt;La sintassi per archiviare è la seguente:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tar -cf archivio.tar file1 file2 file3&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;con cui si riuniscono &lt;code&gt;file1&lt;/code&gt;, &lt;code&gt;file2&lt;/code&gt; e &lt;code&gt;file3&lt;/code&gt; nell&amp;rsquo;unico file &lt;code&gt;archivio.tar&lt;/code&gt;. La lettera &lt;code&gt;c&lt;/code&gt; indica &amp;ldquo;crea&amp;rdquo;, mentre &lt;code&gt;f&lt;/code&gt; sta per &amp;ldquo;file&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;Per archiviare un&amp;rsquo;intera cartella la sintassi è la stessa:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tar -cf archivio.tar directory&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Per estrarre i file la sintassi è:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tar -xf archivio.tar&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;comprimere-i-file&#34;&gt;Comprimere i file&lt;/h2&gt;&#xA;&lt;p&gt;I file possono essere compressi in Linux con due strumenti: &lt;code&gt;gzip&lt;/code&gt; e &lt;code&gt;bzip2&lt;/code&gt;. La differenza tra i due è che &lt;code&gt;bzip2&lt;/code&gt; restituisce file più piccoli (e dunque richiede maggiore potenza di calcolo). La sintassi è la stessa per entrambi (cambiando ovviamente il comando):&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;gzip file1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;che produce il &lt;code&gt;file1.gz&lt;/code&gt; e&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bzip2 file1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;che produce il &lt;code&gt;file1.bz2&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;Fate attenzione al fatto che questi due strumenti &amp;ldquo;trasformano&amp;rdquo; il file, nel senso che cancellano quello originale, lasciando solo la copia compressa.&lt;/p&gt;&#xA;&lt;h2 id=&#34;decomprimere-i-file-compressi&#34;&gt;Decomprimere i file compressi&lt;/h2&gt;&#xA;&lt;p&gt;La decompressione si effettua rispettivamente con&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;gunzip file1.gz&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;e&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bunzip2 file1.bz2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;eliminando anche qui il file compresso e lasciando solo quello originale.&lt;/p&gt;&#xA;&lt;h2 id=&#34;comprimere-e-decomprimere-gli-archivi-tar&#34;&gt;Comprimere e decomprimere gli archivi tar&lt;/h2&gt;&#xA;&lt;p&gt;Anche gli archivi &lt;code&gt;.tar&lt;/code&gt; possono essere a loro volta compressi come un qualunque altro normalissimo file. La sintassi è la stessa identica e quindi i passaggi sono due: archiviazione dei singoli file e successiva compressione dell&amp;rsquo;archivio.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tar -cf archivio.tar file1 file2 file3&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;gzip archivio.tar&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;che restituisce il file &lt;code&gt;archivio.tar.gz&lt;/code&gt;, oppure&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bzip2 archivio.tar&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;che restituisce il file &lt;code&gt;archivio.tar.bz2&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;Si possono anche dare i due comandi in un&amp;rsquo;unica riga:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tar -cf - file1 file2 file3 &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; gzip -c &amp;gt; archivio.tar.gz&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;oppure più comodamente, per &lt;code&gt;gzip&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tar -czf archivio.tar.gz file1 file2 file3&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;per bzip2:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tar -cjf archivio.tar.gz file1 file2 file3&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Per la decompressione, però, è sufficiente un solo comando. Per il primo file:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tar -zxf archivio.tar.gz&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Per il secondo:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tar -jxf archivio.tar.bz2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le opzioni significano nell&amp;rsquo;ordine:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;z&lt;/code&gt; indica un file compresso con &lt;code&gt;gzip&lt;/code&gt; (&lt;code&gt;j&lt;/code&gt;, invece, compresso con &lt;code&gt;bzip2&lt;/code&gt;);&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;x&lt;/code&gt; indica estrazione;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;f&lt;/code&gt; indica il nome del file da decomprimere.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Si ponga attenzione al fatto che con &lt;code&gt;gzip&lt;/code&gt; e &lt;code&gt;bzip2&lt;/code&gt; non è possibile comprimere più file in un&amp;rsquo;unico: ecco perché è necessario passare da &lt;code&gt;tar&lt;/code&gt; prima di comprimere più file assieme.&lt;/p&gt;&#xA;&lt;p&gt;Un&amp;rsquo;ultima nota sulle estensioni. Un file &lt;code&gt;.tar.gz&lt;/code&gt; può presentarsi anche con l&amp;rsquo;estensione &lt;code&gt;.tgz&lt;/code&gt;, mentre uno &lt;code&gt;.tar.bz2&lt;/code&gt; anche come&lt;code&gt;.tbz2&lt;/code&gt;. Ma potrebbero anche non avere alcuna estensione! Se vi dovesse capitare un file compresso senza estensione, è sufficiente dare&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;file nome-file-misterioso&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;per capire di che tipo si tratti.&lt;/p&gt;&#xA;&lt;p class=&#34;photo-credits&#34;&gt;Photo credits:&#xA;    &lt;span class=&#34;photo-author&#34;&gt;holly_northrop&lt;/span&gt;,&#xA;    &#xA;        &lt;span class=&#34;photo-title&#34;&gt;&lt;a href=&#34;http://www.flickr.com/photos/holly_northrop/3053242732/&#34; class=&#34;photo-link&#34;&gt;Man with Briefcase (Work Series)&lt;/a&gt;&lt;/span&gt;,&#xA;    &#xA;    &lt;span class=&#34;photo-license&#34;&gt;CC by-nc-nd&lt;/span&gt;,&#xA;    &#xA;    &lt;span class=&#34;photo-year&#34;&gt;2008&lt;/span&gt;.&#xA;&lt;/p&gt;&#xA;&lt;p&gt;L&#39;articolo &lt;a href=&#34;https://www.aldolat.it/posts/2008/archiviazione-e-compressione-in-linux/&#34;&gt;Archiviazione e compressione in Linux&lt;/a&gt; è uno scritto di &lt;a href=&#34;https://www.aldolat.it/&#34;&gt;aldolat.it&lt;/a&gt;. Rispettane le &lt;a href=&#34;https://www.aldolat.it/info/#licenza&#34;&gt;condizioni di licenza&lt;/a&gt;.&lt;/p&gt;</content:encoded>
        </item>
        <item>
            <title>Come sfogliare la cronologia dei comandi da terminale</title>
            <link>https://www.aldolat.it/posts/2008/come-sfogliare-la-cronologia-dei-comandi-da-terminale/</link>
            <pubDate>Wed, 20 Aug 2008 12:29:48 +0000</pubDate>
            <author>aldolat@gmail.com (Aldo Latino)</author>
            <guid>https://www.aldolat.it/posts/2008/come-sfogliare-la-cronologia-dei-comandi-da-terminale/</guid>
            <description>Tutti certamente sappiamo che per sfogliare gli ultimi comandi da terminale basta premere la freccia in su per ritrovarceli nuovamente pronti per essere lanciati. Ma oltre a questo, possiamo chiedere di più. Infatti, se vogliamo riprendere un comando specifico che abbiamo dato tempo fa, possiamo farlo con estrema facilità. Ad esempio, se un mese fa avevamo dato questo complesso comando:&#xA;bzr push bzr+ssh://utente@bazaar.launchpad.net/~utente/progetto/branch possiamo richiamarlo immediatamente digitando solo&#xA;bzr push e premere PagUp: il terminale vi farà scorrere la lista dei comandi che cominciano per bzr push.</description>
            <content:encoded>&lt;figure class=&#34;aligncenter&#34;&gt;&lt;img src=&#34;https://www.aldolat.it/images/2008/08/boot.jpg&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;figure class=&#34;alignleft&#34;&gt;&lt;img src=&#34;https://www.aldolat.it/images/2008/08/terminale.png&#34; width=&#34;150&#34; height=&#34;127&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;Tutti certamente sappiamo che per sfogliare gli ultimi comandi da terminale basta premere la freccia in su per ritrovarceli nuovamente pronti per essere lanciati. Ma oltre a questo, possiamo chiedere di più. Infatti, se vogliamo riprendere un &lt;em&gt;comando specifico&lt;/em&gt; che abbiamo dato tempo fa, possiamo farlo con estrema facilità. Ad esempio, se un mese fa avevamo dato questo complesso comando:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bzr push bzr+ssh://utente@bazaar.launchpad.net/~utente/progetto/branch&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;possiamo richiamarlo immediatamente digitando solo&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bzr push&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;e premere &lt;code&gt;PagUp&lt;/code&gt;: il terminale vi farà scorrere la lista dei comandi che cominciano per &lt;code&gt;bzr push&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Per compiere questa magia, è sufficiente editare il file &lt;code&gt;/etc/inputrc&lt;/code&gt; e modificare una riga:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo nano /etc/inputrc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Scorrete in basso fino a trovare il seguente blocco (siamo alle righe 40-42):&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# alternate mappings for &amp;#34;page up&amp;#34; and &amp;#34;page down&amp;#34; to search the history&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;#&amp;#34;\e[5~&amp;#34;: history-search-backward&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;#&amp;#34;\e[6~&amp;#34;: history-search-forward&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Togliete il commento alle righe 41 e 42 (cioè il carattere &lt;code&gt;#&lt;/code&gt;) e salvate con &lt;code&gt;CTRL+O&lt;/code&gt; e uscite con &lt;code&gt;CTRL+X&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Chiudete il terminale e riapritelo. Provate ora a digitare una sequenza che avete già fatto, ad esempio:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;e premete il tasto &lt;code&gt;PagUp&lt;/code&gt;. Scorrerete così solo la cronologia che comincia con &lt;code&gt;sudo apt&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;A me risulta estremamente utile e fa risparmiare tempo e meningi. 🙂&lt;br&gt;&#xA;Un piccolo video per vedere in atto le operazioni:&lt;/p&gt;&#xA;&lt;p&gt;Photo courtesy: &lt;a href=&#34;http://www.flickr.com/photos/fallsroad/13240207/&#34;&gt;fallsroad&lt;/a&gt;, &lt;em&gt;boot&lt;/em&gt;, CC &lt;a href=&#34;https://creativecommons.org/licenses/by-nc-nd/3.0/&#34;&gt;by-nc-nd&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;L&#39;articolo &lt;a href=&#34;https://www.aldolat.it/posts/2008/come-sfogliare-la-cronologia-dei-comandi-da-terminale/&#34;&gt;Come sfogliare la cronologia dei comandi da terminale&lt;/a&gt; è uno scritto di &lt;a href=&#34;https://www.aldolat.it/&#34;&gt;aldolat.it&lt;/a&gt;. Rispettane le &lt;a href=&#34;https://www.aldolat.it/info/#licenza&#34;&gt;condizioni di licenza&lt;/a&gt;.&lt;/p&gt;</content:encoded>
        </item>
        <item>
            <title>Come ridimensionare al volo 140 foto</title>
            <link>https://www.aldolat.it/posts/2007/come-ridimensionare-al-volo-140-foto/</link>
            <pubDate>Sun, 04 Mar 2007 16:57:08 +0000</pubDate>
            <author>aldolat@gmail.com (Aldo Latino)</author>
            <guid>https://www.aldolat.it/posts/2007/come-ridimensionare-al-volo-140-foto/</guid>
            <description>Il castello di Brucoli, a due passi da Augusta (Siracusa).&#xA;Oggi devo spedire al mio servizio di stampa foto su Internet 140 fotografie, tutte ovviamente scattate alla massima risoluzione (6 megapixel). Evidentemente il formato è troppo grande per essere spedito velocemente e comunque è eccessivamente grande per le dimensioni di stampa (13×17 cm).&#xA;Dunque bisogna ridimensionarle. Esclusa la possibilità di farlo una ad una, c&amp;rsquo;è un metodo rapido ed automatico: usare il terminale! 😀</description>
            <content:encoded>&lt;figure class=&#34;aligncenter&#34;&gt;&lt;img src=&#34;https://www.aldolat.it/images/2007/03/100_2399.jpg&#34;&#xA;&#x9;&#x9;&#x9;alt=&#34;Il castello di Brucoli, a due passi da Augusta (Siracusa).&#34;&gt;&lt;figcaption&gt;&#xA;&#x9;&#x9;&#x9;&lt;p&gt;Il castello di Brucoli, a due passi da Augusta (Siracusa).&lt;/p&gt;&#xA;&#x9;&#x9;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;Oggi devo spedire al mio servizio di stampa foto su Internet 140 fotografie, tutte ovviamente scattate alla massima risoluzione (6 megapixel). Evidentemente il formato è troppo grande per essere spedito velocemente e comunque è eccessivamente grande per le dimensioni di stampa (13×17 cm).&lt;/p&gt;&#xA;&lt;p&gt;Dunque bisogna ridimensionarle. Esclusa la possibilità di farlo una ad una, c&amp;rsquo;è un metodo rapido ed automatico: usare il terminale! 😀&lt;/p&gt;&#xA;&lt;h2 id=&#34;imagemagick&#34;&gt;Imagemagick&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.imagemagick.org&#34;&gt;Imagemagick&lt;/a&gt; lo trovate nei repo ufficiali di Ubuntu e consiste in un set di tools vari per manipolare le immagini. Eccone alcune:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Format conversion: convert an image from one format to another (e.g. PNG to JPEG)&lt;/li&gt;&#xA;&lt;li&gt;Transform: resize, rotate, crop, flip or trim an image&lt;/li&gt;&#xA;&lt;li&gt;Transparency: render portions of an image invisible&lt;/li&gt;&#xA;&lt;li&gt;Draw: add shapes or text to an image&lt;/li&gt;&#xA;&lt;li&gt;Decorate: add a border or frame to an image&lt;/li&gt;&#xA;&lt;li&gt;Special effects: blur, sharpen, threshold, or tint an image&lt;/li&gt;&#xA;&lt;li&gt;Image calculator: apply a mathematical expression to an image or image channels&lt;/li&gt;&#xA;&lt;li&gt;Text &amp;amp; comments: insert descriptive or artistic text in an image&lt;/li&gt;&#xA;&lt;li&gt;Image identification: describe the format and attributes of an image&lt;/li&gt;&#xA;&lt;li&gt;Animation: create a GIF animation sequence from a group of images&lt;/li&gt;&#xA;&lt;li&gt;Composite: overlap one image over another&lt;/li&gt;&#xA;&lt;li&gt;Montage: juxtapose image thumbnails on an image canvas&lt;/li&gt;&#xA;&lt;li&gt;Large image support: read, process, or write mega- and giga-pixel image sizes&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;il-fantastico-comando&#34;&gt;Il fantastico comando&lt;/h2&gt;&#xA;&lt;p&gt;Aprite il terminale e puntate alla cartella dove deve avvenire la trasformazione. Quindi digitate:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mogrify -resize 1600x1600 *.jpg&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Con questo comando tutte le immagini che ho nella mia cartella, che hanno dimensioni di 2856×2142, vengono ridimensionate in un colpo solo a 1600×1200, più che sufficienti per il mio scopo.&lt;br&gt;&#xA;In sostanza, le foto &amp;mdash; scattate sia in orizzontale che in verticale (landscape e portrait) &amp;mdash; vengono inserite in un quadrato di 1600×1600 pixel e ridimensionate mantenendo le proporzioni, vale a dire si mantiene il lato lungo della foto a 1600 pixel.&lt;/p&gt;&#xA;&lt;p&gt;Ovviamente potete variare questo valore come volete, ma date solo quello più lungo.&lt;br&gt;&#xA;Occhio al comando che considera tutti i file che finiscano con &lt;code&gt;.jpg&lt;/code&gt;: se ci sono foto con &lt;code&gt;.jpeg&lt;/code&gt; queste non verranno trattate; eventualmente sostituite il nome con un semplice asterisco &lt;code&gt;*&lt;/code&gt; (tutti i file).&lt;/p&gt;&#xA;&lt;div class=&#34;note warning&#34;&gt;&#xA;    &#xA;    &lt;div class=&#34;title-note&#34;&gt;&#xA;        Attenzione&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;p class=&#34;aside&#34;&gt;&#xA;        Il comando &lt;strong&gt;sovrascrive&lt;/strong&gt; le immagini della cartella! Se dovete mantenere le originali intatte, lanciate quel comando su una copia dei file.&#xA;    &lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;L&#39;articolo &lt;a href=&#34;https://www.aldolat.it/posts/2007/come-ridimensionare-al-volo-140-foto/&#34;&gt;Come ridimensionare al volo 140 foto&lt;/a&gt; è uno scritto di &lt;a href=&#34;https://www.aldolat.it/&#34;&gt;aldolat.it&lt;/a&gt;. Rispettane le &lt;a href=&#34;https://www.aldolat.it/info/#licenza&#34;&gt;condizioni di licenza&lt;/a&gt;.&lt;/p&gt;</content:encoded>
        </item>
        <item>
            <title>Avviare programmi da terminale</title>
            <link>https://www.aldolat.it/posts/2006/avviare-programmi-da-terminale/</link>
            <pubDate>Mon, 02 Oct 2006 19:08:13 +0000</pubDate>
            <author>aldolat@gmail.com (Aldo Latino)</author>
            <guid>https://www.aldolat.it/posts/2006/avviare-programmi-da-terminale/</guid>
            <description>Quando avviamo un programma da terminale, ad esempio gedit, il terminale rimane in attesa che si finisca con quel programma e se mentre è aperto il programma avviato chiudete il terminale, si chiude anche il programma. Insomma restano intimamente legati. Per &amp;ldquo;staccare&amp;rdquo;, diciamo così, il terminale dal programma lanciato, date il comando solito più il simbolo &amp;amp;.&#xA;Ad esempio, diamo:&#xA;gedit e il terminale aprirà l&amp;rsquo;editor di testo. Adesso se chiudiamo il terminale si chiuderà anche l&amp;rsquo;editor. Se invece diamo:</description>
            <content:encoded>&lt;p&gt;Quando avviamo un programma da terminale, ad esempio gedit, il terminale rimane in attesa che si finisca con quel programma e se mentre è aperto il programma avviato chiudete il terminale, si chiude anche il programma. Insomma restano intimamente legati. Per &amp;ldquo;staccare&amp;rdquo;, diciamo così, il terminale dal programma lanciato, date il comando solito più il simbolo &lt;code&gt;&amp;amp;&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Ad esempio, diamo:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;gedit&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;e il terminale aprirà l&amp;rsquo;editor di testo. Adesso se chiudiamo il terminale si chiuderà anche l&amp;rsquo;editor. Se invece diamo:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;gedit &lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;possiamo usare distintamente il terminale e l&amp;rsquo;editor di testo che vivranno di vita propria.&lt;/p&gt;&#xA;&lt;p&gt;L&#39;articolo &lt;a href=&#34;https://www.aldolat.it/posts/2006/avviare-programmi-da-terminale/&#34;&gt;Avviare programmi da terminale&lt;/a&gt; è uno scritto di &lt;a href=&#34;https://www.aldolat.it/&#34;&gt;aldolat.it&lt;/a&gt;. Rispettane le &lt;a href=&#34;https://www.aldolat.it/info/#licenza&#34;&gt;condizioni di licenza&lt;/a&gt;.&lt;/p&gt;</content:encoded>
        </item>
    </channel>
</rss>
