rc ovvero ci sono più cose in cielo e in terra…

get_bigUn postino che non so se vale. Ma ho una manciata di giustificazioni (o scuse) per auto-assolvermi:

  • un post già quasi pronto lo blocco perché riguarda cose non più supportate;
  • la solita filosofia Unix, ne ho parlato recentemente e è materia controversa (Massimo non ha tutti i torti, anzi!);
  • l’amico Luigi Bit3Lux posta spesso su questi argomenti, p.es. qui, qui e qui.

Tutto nasce da quest’immagine:

meaning of strange unix-linux command names.001

La trovate su G+, qui.

Fa parte di nixCraft: NixCraft is an online community of new and seasoned Linux / Unix sysadmins who want to make the most of sysadmin-hood.
Volendo c’è anche su Facebook, credo con le stesse cose (forse, non lo seguo).

Allora, tornando all’immagine, quasi tutto OK. Ricordo che quando mi approcciai a Unix tee mi risultò inizialmente ostico perché il COMO (command output) sul Prime era molto meglio (no, solo diverso ma l'abitudine...) e poi non avevo capito il perché del nome, cosa per cui l'immagine su in alto.

Perl se ricordo bene era allora nuovissimo, non si capiva nemmeno dove volesse andare a parare; sarebbe diventato di moda anni dopo alla nascita del Web.

Invece rc. OOPS non lo conosco! Controllo sul manuale cartaceo di SisV di Apollo, manca. Panico? No, c'è la Wiki.
Toh! Plan 9. È la shell di 9P. E c'è anche per Linux anche se non so se serve; per adesso no.

Invece Plan 9, qualche mese fa un giovane nerd me ne parlava entusiasta, peccato che in quel momento non ho pensato di sfruttare l'occasione. Persa, chissà se riesco a rintracciarlo.

OK, nostalgia-mode off :wink:

Visto nel Web – 140

Troppa afa; ma the show must go on, ecco cosa ho visto nel Web.

Bs0SY87CUAAnj6S
Robots Are Invading the News Business, and It’s Great for Journalists
::: NYMag

Gmail users have an extra email address
vero ma ti arriva con l’indirizzo usuale
::: The Ubuntu Incident

Making embedded Linux computer
::: Henrik’s

vet

Interactive scientific computing; of pythonic parts and goldilocks languages
meraviglioso! disclaimer: io sono skyzoide, appartengo ad entrambe le categorie, la seconda mi affascina ma bazzico la prima :mrgreen:
::: Lambda the Ultimate

19% of EU population aged 16–74 has never used a computer
::: Twitter ::: eurostat

Google chiede un dibattito pubblico sul diritto all’oblio
::: il Sole 24 Ore

wan ta cheng

L’apprentissage du « code informatique » sera proposé à l’école primaire dès septembre
::: Le Monde

NSA Says Snowden Emails Exempt From Public Disclosure
::: Slashdot

MATE, il fork di Gnome 2 che mi piace!
::: my life according to me v2.0

Snooperman

Linux, Canonical canta vittoria a Monaco
::: Punto Informatico

New product launch! Introducing Raspberry Pi Model B+
::: Raspberry Pi

Il Comune “licenzia” Microsoft Office
Nei 900 computer di palazzo un sistema open source. «Risparmiamo 360 mila euro»
::: Messaggero Veneto

lispview

Microsoft says super-cheap Windows devices are on the way
::: Engadget

An FBI Counterterrorism Agent Tracked Me Down Because I Took a Picture of This
::: ACLU

PDFy
Your PDF hosted permanently, ad-free
::: PDFy

servizio

How a Supercomputer Beat the Scrap Heap and Lived On To Retire In Africa
::: Slashdot

Linux Day 2014
::: Linux Day 2013

You Can’t Sit on the Sidelines and Become a Philosopher
parla proprio di me; kwasy :grin:
::: Programming in the 21st Century

10530739_10204259667992099_5299146748652962821_n

Installare linux su Android
::: Solo un altro inutile blog

Luca ha dieci anni e non dorme
::: manteblog

Mozilla Advances JPEG Encoding with mozjpeg 2.0
::: https://blog.mozilla.org

unannodopo

OpenSSL fork LibreSSL is declared “unsafe for Linux”
::: LWN

Pseudonyms Now Allowed On Google+
::: Slashdot

Is the Software Renaissance Ending?
::: Slashdot

scia

Beautiful and free fonts for all languages
::: Google

Fcc, Google, Facebook, Netflix, eBay, e la net neutrality
::: Luca De Biase ::: Slashdot

Un inatteso competitor per i paesi che sperano di attrarre capitali alla filiera delle startup
::: Luca De Biase

seppiatura

seppiatura

French Blogger Fined For Negative Restaurant Review
::: Slashdot

A list of search results omitted, erased, or censored due to the “Right to be forgotten”
::: Hidden From Google

Rand Paul and Silicon Valley’s Shifting Political Climate
::: Slashdot

Bsoq2YfIUAAF3h9

Firefox: catturare porzioni (e non solo) delle pagine web visitate
::: Gioxx

Dangerous practice of digital mass surveillance must be subject to independent checks and balances – Pillay
::: UN Human Rights

Ciao @Winditalia , hai appena perso un cliente
::: Il nuovo mondo di Galatea

simili

Why We Use OCaml
::: Esper

Sony Forgets To Pay For Domain, Hilarity Ensues
LOL :wink:
::: Slashdot

Microsoft CEO To Slash 18,000 Jobs, 12,500 From Nokia To Go
::: Slashdot ::: Business Insider

Silvio Berlusconi

Nimrod by Example
::: Nimrod by Example

SimpleStartpage
Little startpage for web browsers by Matteo Pani
io la uso da sempre come home-page di Firefox; l’ho chiamata iMattux
::: github

Parrot Security OS 1.0 – recensione
::: HackerNetwork

10561583_580078255427033_8561982680237711134_n

Installazione di Linux in dual-boot con secure-boot ( UEFI )
::: AVi LUG

Creare una chiavetta USB avviabile multi-sistema
::: AVi LUG

Michael Carroll to Congress: “Copyrights have to expire.”
::: Creative Commons

Simon Barry

Simon Barry

Python for Android Tutorial #1 – Using the accelerometer
::: Byte::Debugger();

Australian bill will put journos in prison for 10 years for reporting leaks
::: Boing Boing

Jolla will sell its Sailfish OS smartphone in India within the next month, exclusively via Snapdeal
::: The Next Web

Roberto Pinotti

Roberto Pinotti

Heinz Zemanek Passes At 94
RIP. La verifica che 5073548261 è primo oggi è immediata, p.es. newlisp -e '(factor 5073548261)' o, più semplicemente, factor 5073548261
::: Slashdot

Snowden contro Dropbox: "È ostile alla privacy, usate piuttosto SpiderOak"
::: Downloadblog

#WhyIBlog Intervista a Alessio Biancalana
::: AC - Il weblog di Andrea Contino

zombieapproach

Multi-Lingual Blogs?
questione molto interessante
::: pwnd

Ecco l'ufficio di Linus Torvalds
::: Marco's Box

Al via commissione per Internet Bill of Rights
::: Luca De Biase

wan-ta-cheng

Programming is not math, huh?
::: Jeremy Kun

A vaulted space
::: manteblog

JavaScript Notes
::: Connor Johnson

1157647_10152098315129748_1433571845_n

Epifani sulla commissione su internet Bill Of Rights
::: Twitter

Future Programming Language For Android Development
::: Android Development Journal

Bs4iWjZIAAAOCbi

the small tools manifesto for bioinformatics
ehi! in sintonia con il mio post recente :grin:
::: github

The US embassy in Germany right now
::: Twitter

Martin Zehetmayer

Martin Zehetmayer

Backup solo se… adesso con Python – 2

Continuo da qui.

n3

click

E finisco per adesso. Nel senso che la versione da terminale è a posto, funziona (pare). Quando tornerà il mio giovane aiutante –anzi committente– G. attualmente in vacanza con i nonni e senza PC vedrò se lo soddisfa. Restano anche da fare: 1) la verifica su Windows (in settimana, probabilmente); e 2) montare un’interfaccia grafica (prossimamente, forse).

tag

Copia in una directory scelta i file elencati nel file di configurazione tag-orig che si trova nella stessa directory del programma. Una copia di questo file di configurazione lo trovate nel post sopraindicato.

Può essere lanciato in due modi, come dallo screenshot qui sotto.

#!/usr/bin/python3

import sys, os.path, shutil

def getorig():
    progname = sys.argv[0]
    progdir = os.path.dirname(progname)
    fbk = os.path.join(progdir, "tag-orig")
    inpf = open(fbk, "r")
    txt = inpf.readlines()
    inpf.close()
    ele = []
    for st in txt:
        sst = st.strip()
        if len(sst) > 0:
            sst = os.path.expanduser(sst)
            fn = os.path.abspath(
                os.path.join(progdir, sst))
            ele.append(fn)
    return ele

def getbkdir():
    if len(sys.argv) > 1:
        dest = os.path.abspath(sys.argv[1])
        if not os.path.isdir(dest):
            dest = ''
    else:
        dest = os.getcwd()

    return dest    

ORIG = getorig()
BKDIR = getbkdir()

if len(BKDIR) == 0:
    print('***', BKDIR, 'non esiste')
    sys.exit(1)

for fn in ORIG:
    print(fn)
    if os.path.isfile(fn):
        sz = os.path.getsize(fn)
        dest = os.path.join(BKDIR, os.path.basename(fn))
        if sz > 7:
            print("\tcopio", fn, "in", dest)
            shutil.copyfile(fn, dest)

tag
agpa
è quello raccontato qui.
OK, forse serve un piccolissimo manuale:

tag [dest]

se dest è una directory (di solito su un drive USB) copia i file elencati nel file di configurazione tag-orig presente nella stessa directory dello script in dest, se non presente la directory di destinazine è quella corrente (quella di $PWD).

r-tag

Copia i file precedentemente salvati con tag nelle loro posizioni originai. Non sovrascrive i file vecchi ma li rinomina aggiungendo a ognuno il suffisso "-old".

#!/usr/bin/python3

import sys, os.path, shutil

def getorig():
    progname = sys.argv[0]
    progdir = os.path.dirname(progname)
    fbk = os.path.join(progdir, "tag-orig")
    inpf = open(fbk, "r")
    txt = inpf.readlines()
    inpf.close()
    ele = []
    for st in txt:
        sst = st.strip()
        if len(sst) > 0:
            sst = os.path.expanduser(sst)
            fn = os.path.abspath(
                os.path.join(progdir, sst))
            ele.append(fn)
    return ele

def getbkdir():
    if len(sys.argv) > 1:
        bkdir = os.path.abspath(sys.argv[1])
        if not os.path.isdir(bkdir):
            bkdir = ''
    else:
        bkdir = os.getcwd()

    return bkdir    

ORIG = getorig()
BKDIR = getbkdir()

if len(BKDIR) == 0:
    print('***', BKDIR, 'non esiste')
    sys.exit(1)

for fn in ORIG:
    print(fn)
    bkfile = os.path.join(BKDIR, os.path.basename(fn))
    if os.path.isfile(fn):
         shutil.copyfile(fn, fn + '-old')
    if os.path.isfile(bkfile):
        print("\tcopio", bkfile, "in", fn)
        shutil.copyfile(bkfile, fn)

Non metto l'immagine dello screenshot, è molto simile alla precedente e ugualmente incomprensibile.

Manuale minimo:

r-tag [bkdir]

copia i file di back-up presenti nella directory corrente o quella specificata con il parametro bkdir nelle loro posizioni originali, come definite dal file tag-orig. I file vecchi vengono rinominati aggiungendo il suffisso "-old".

a-tag

Accoda ai file indicati nel file di configurazione tag-orig le aggiunte con lo steso nome ma con il prefisso "a-".

#!/usr/bin/python3

import sys, os.path, shutil

def getorig():
    progname = sys.argv[0]
    progdir = os.path.dirname(progname)
    fbk = os.path.join(progdir, "tag-orig")
    inpf = open(fbk, "r")
    txt = inpf.readlines()
    inpf.close()
    ele = []
    for st in txt:
        sst = st.strip()
        if len(sst) > 0:
            sst = os.path.expanduser(sst)
            fn = os.path.abspath(
                os.path.join(progdir, sst))
            ele.append(fn)
    return ele

def getbkdir():
    if len(sys.argv) > 1:
        bkdir = os.path.abspath(sys.argv[1])
        if not os.path.isdir(bkdir):
            bkdir = ''
    else:
        bkdir = os.getcwd()

    return bkdir    

ORIG = getorig()
BKDIR = getbkdir()

if len(BKDIR) == 0:
    print('***', BKDIR, 'non esiste')
    sys.exit(1)

for fn in ORIG:
    print(fn)
    aggfile = os.path.join(BKDIR, 'a-' + os.path.basename(fn))
    if os.path.isfile(aggfile):
        print("\taggiungo", aggfile, "a", fn)
        f = open(aggfile, 'r')
        agg = f.read()
        f.close()
        f = open(fn, 'a')
        f.write(agg)
        f.close()

Manuale:

a-tag [aggdir]

accoda ai file inidcati nel file di configurazione tag-orig i file con lo stesso nome ma con prefisso "a-" presenti nella directory aggdir; se aggdir non è specificata viene assunta quella corrente.

Non so voi ma nello scrivere questo post mi si sono sviluppati i brufoli :mrgreen:

La filosofia di Unix

Un post filosofico o lubitoso o nostalgico. O semplicemente –beh giudicate voi.
Ieri su G+ qualcuno condivide quest’immagine

The UNIX Philosophy.001
Pare che venda da qui.

Bella, mi ci ritrovo pienamente. Tanto che appena possibile mi metto a cercare, la Wiki (come faremmo senza! (auto-cit.)), Dr.Dobb’s e altro ancora, nel Web c’è parecchio sull’argomento. Tanto che mi son detto prima o poi, forse, chissà…
E, la conbinassione! oggi Luigi Bit3Lux ti fa un post proprio in quella direzione: Underscore [Brevi Esercizi].
E allora non ho più scuse: la filosofia Unix, quella dell’immagine, vale ancora? Vale ancora scrivere script da eseguire sulla riga di comando, usando i tool forniti dal sistema operativo, proprio come si faceva una volta? E gli esempi forniti da Luigi sono eleganti. E usa anche AWK, quello che a me dicevano che era troppo ostico; e qui forse il mio capo di allora aveva ragione, scelgo la versione Bash, o quella con tr, o …
Però, oltre a finire tag ho in programma una serie di post con finestre, pulsanti e quant’altro, sono incoerente, forse :shock:

Luigi è il papà di Lubit, distro velocissima che invoglia all’uso del terminale, come si usava una volta (non solo nèh, non manca niente per quelli che arrivano da Windoze). E riguardo Lubit mi ricordo sempre la sgridata di Squittymouse quando ho riportato che non si potevano mettere cartelle, documenti, icone e altro ancora sul desktop. Ovviamente ha ragione Squitty.

Appena posso devo indagare su Mike Gancarz, chissà…
Poi c’è anche un tot di nostalgia, tanto che mi viene da mttere questo video :lol:

Tutto Falcon – lunga chiacchierata con Giancarlo Niccolai

logoCome farei se non ci fosse Twitter?  Panico! davvero. OK, lo stesso vale per la Wiki e Stack Overflow e parecchi blog (anche nuovi, anzi in fondo ve ne linko uno appena scoperto; poi c’è sempre quello nuovissimo di Alberto :wink: ).
Ma sono gia OT prima ancora di cominciare –ricomincio.

tweetAllora, c’è questo tweet dove Giancarlo Niccolai il papà di Falcon ci dice proprio tutto sul suo linguaggio. Ne abbiamo già parlao qui sul blog, sia io che –sopratutto– Robitex. Perché tra le N-alla-N cose che mi piacerebbe fare c’è Falcon, anzi ha una priorità decisamente alta. Chissà…
E perdono a Giancarlo quello che ha detto del Lisp, cioè che secondo lui è facile per il ‘puter meno per gli umani; opinione parecchio diffusa. Anzi, adesso che ci penso, non del tutto campata in aria, anzi… :roll:

OK, buona visione, video lungo ma davvero notevole, qui.

Inoltre Giancarlo ha un blog tutto suo che si chiama Giancalo Niccolai, bello ma non troppo aggiornato, lì trovate che i tweet in giapponese hanno un perché. C’è poi, ovviamente il The Falcon Programming Language, per chi vuole saperne di più (e quello che non RSSisco per non sentirmi ancora di più in colpa).


Adesso qualcosa di completamente differente (cit.): come i più attenti frequentatori del blog sapranno sono anche evangelista aggiunto a tempo parziale di Lubit e allora volevo segnalarvi un nuovo blog: InformaticaBlog’s PC di Agostino Liuni. Il post che me l’ha fatto scoprire è Lubit Linux: Come installare, bello, didascalico, un post di quelli che piacciono a me.

Modificare temporaneamente PATH

code on

OOPS!!! post aggiornato, vedi in fondo.

Nel post di ieri mi sono trovato improvvisamente in una situazione di OK, panic now!
Cosa che è sempre sbagliata, a prescindere, come direbbe Totò. Ma forse è meglio che vi racconti tutto; la storia è breve, anzi questo è un minipost.

Linux, checché se ne dica, è semplice e amichevole, potrei citare Dennis, anzi ecco:

UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity.

Qui, con tante altre.

Dunque, Linux è amichevole ma bisogna saperlo usare. E la mia memoria a volte… come ieri. Alla fine ho lasciato perdere ma ho preso un appunto, inutile perché continuo a pensarci senza volerlo.

Il problema è semplice: se avete uno script o un eseguibile da lanciare da terminale riuscite a eseguirlo solo se è in una directory presente nella variabile PATH.

p0

Manca la directory corrente, cosa non grave basta scrivere ./ prima del nome dello script. Vediamo un esempio pratico che viene tutto più semplice.
Ecco lo script hw.py:

#!/usr/bin/python3

import os

print("ciao", os.getenv("USER") + "!\n")

hw.py

Nella directory corrente lo si può attivare e eseguire, così:

p2

Ma se ci spostiamo in un'altra directory il comando diventa lungo:

p3

Vero che basta digitare le prime lettere di ogni sub-dir e usare il tasto Tab (la prima volta poi c'è l'history) ma è comunque una noia. Si può modificare la PATH, temporaneamente, aggiungendo la dir corrente, quella che ottieni con pwd? Certo! adesso vi faccio vedere come.
A dirla tutta ho pasticciato un pochino poi sono andato su Stack Overflow, non sapevo che esiste la variabile d'ambiente PWD.
In poche parole tutto quello che devo fare è export PATH=$PWD:$PATH, così:

p4

che rende facile il richiamo dello script dovunque:

p5

E, naturalmente è temporaneo, vale per la sessione e sparisce quando chiudi il terminale. OK?
Ma aspetta, il comando è lungo, casinato, con lettere maiuscole...
Non sono riuscito completamente, anche se mi ci sono avvicinato. Creo lo script agpa (da aggiungi a PATH), questo:

#!/bin/bash
export PATH=$PWD:$PATH
echo $PATH

e posso eseguirlo con source.

p6
source
si rende necessario per esportare la modifica della variabile che altrimenti vive solo all'interno dello script. Praticamente agpa può essere spostato in ~/bin e lanciato così:

p7

vedi sotto; più semplice

In alternativa, ancora meglio, rinominarlo .agpa, spostarlo nella propria home e lanciarlo con source ~/.agpa.

Aggiornamento: conviene spostarlo in ~/bin e si può quindi lanciare semplicemente con source agpa, così:

p8

Naturalmente se qualcuno ha una soluzione migliore benvenuto :grin:

Visto nel Web – 139

Quasi ferie, o meglio vacanze per chi ancora va a scuola. Io invece qui, al solito, e come al solito ecco cosa ho visto nel Web.LJ-Extremist-red-stamp
trash-cli – Command Line Interface to FreeDesktop.org Trash
::: github

IEEE Spectrum Ranks the Top Programming Languages
::: Slashdot

Classic algorithms and data structures in coffeescript
::: github

7_Telefono

How Does One Create A Gtk+ Application?
::: GNOME

First they came for the Whistleblowers, and I did not speak out
::: Cognizant Transmutation

New Single Board Computer Lets You Swap Out the CPU and Memory
::: Slashdot

377814_244326458970620_2026297833_n

10 Combinazioni veloci da tastiera per la shell Linux
::: alexiobash

Copiare ai tempi della twittervisione
::: manteblog

Ellipsoid surface area
::: The Endeavour

Richard Stallman spiega perchè usare free software nelle scuole
::: You Tube

Br3rm3TIIAAFRdU

Unix for the Beginning Mage
A Tutorial by Joe Topjian
::: Unix Mages

The Elements of HTML
::: W3C

Compenso poco equo e difeso malamente. Parlano Caselli, Conte, Ghezzi, Guccini ecc
::: Luca De Biase

brosio

Bash: test di sistema “fai da te”
::: Extended Reality

Intro to BoltDB: Painless Performant Persistence
::: Nate Finch’s

Robolinux 7.5.4: da Windows a Linux senza dolore
::: TUXJournal

Br7gQiJCYAAe4TP

Rivoluzione digitale
materiale da un corso al Politecnico di Torino, speciale :grin:
::: Rivoluzione Digitale

Google svela il fatturato italiano
::: Punto Informatico

MIT And Dropbox Alums Launch Inbox, A Next-Generation Email Platform
::: TechCrunch

BsELwxRIIAAFgCc

Go-like concurrency (and profiling!) in Hy and PyPy
::: Tao of Mac

Python is now the most popular introductory teaching language at top U.S. universities
::: CACM

OCaml for the Masses
::: ACMQ

27-copia

Remove Windows 8.1, then install Windows 7 and Ubuntu 14.04 in UEFI mode
::: The Ubuntu Incident

Awesome Python
A curated list of awesome Python frameworks, libraries and software
::: github

Three biggest internet companies in each country
::: The Economist

enhanced-buzz-32445-1404905663-4

Europa digitale. Italia deve cambiare interfaccia
::: Luca De Biase ::: Luca De Biase

The World’s Best Living Programmers
mah!
::: Slashdot

Il genio politico di Guido: il vero esperimento di Facebook
::: Luca De Biase

BsLBwVfCUAAAUyr

Welcome to WCSAxes’s documentation!
WCSAxes is a framework for making plots of Astronomical data in Matplotlib
::: WCSAxes

Making change
sai ‘na roba? avendo tempo si potrebbe verificare con newLISP, chissà…
::: The Endeavour

installing new fonts
::: The Ubuntu Incident

BsC1JENCMAAt1wn

EMR Streaming in Go
::: The New York Times

funcgo
Funcgo is a compiler that converts Functional Go into Clojure, to run on the JVM or as JavaScript. The compiler and language is still in alpha.
::: github

Beginner’s guide to OCaml beginner’s guides
::: Alex Clemmer

10449786_782822918419337_88445154_n

A Peek Inside D-Wave’s Quantum Computing Hardware
::: Slashdot

First Release of LibreSSL Portable Is Available
::: Slashdot

Chinese State Media Declares iPhone a Threat To National Security
::: Slashdot

monument-valley

Costruiamo una calcolatrice
AWK, il tool universale
::: the secrets of ubuntu

O3b Launches Four More Satellites To Bring Internet To ‘Other 3 Billion’
::: Slashdot ::: la Repubblica

Vi(m): impararlo con un solo video
::: Bl@ster’s

kinder

La Corea del Sud sceglie Linux come alternativa a Windows 7
::: lffl

Rust Guidelines
::: github

LibreOffice nella PA
Dieci motivi per scegliere il risparmio, l’accessibilità e la qualità delle soluzioni open
::: Data Manager Online ::: devs on acid

broken_windows-wallpaper-1920x1080

647,000 Comments Have Been Sent To The FCC About Net Neutrality. Keep Them Coming
::: TechCrunch

Perché il diritto all’oblio dovrebbe esser negato per chi ha commesso reati
::: Google+

BsR4Q8sCQAAKlln

Patoline
A modern digital typesetting system
::: Patoline

Perla da articoli che spiega come disintallare un programma Ubuntu
::: Twitter

Br88vGrIUAAcvXp

Backup solo se… adesso con Python – 1

n2
Continuo da qui. Ma cambio tutto. Con bash, shell di Linux, usata negli script dei post precedenti abbiamo visto che non è facilissimo. O meglio, non è come siamo abituati. E poi c'è un grosso limite: non funziona con Windows.
E se provassimo a usare Python?
Sì è un'idea, traduciamo l'ultima versione dello script. Una cosa: da parecchio ormai di Python ne esistono due versioni: la 2.x che continua a essere usatissima per lo più per inerzia e la 3.x, ormai giunta a 3.4; userò questa. Peraltro le differenze (per quello che dobbiamo fare) sono minime.

Ecco la versione iniziale dello script:

#!/usr/bin/python3

import os.path, shutil

ORIG = ["./orig-1/f-1",
        "./orig-1/f-2-piccolo",
        "./orig-2/f1-3",
        "./orig-3/f1 4",
        "./orig-3/f2-4 manca"
       ]

DEST = "./dest/"

for fn in ORIG:
    print(fn)
    if os.path.isfile(fn):
        sz = os.path.getsize(fn)
        dest = DEST + os.path.basename(fn)
        if sz > 7:
            print("\tcopio", fn, "in", dest)
            shutil.copyfile(fn, dest)

t1

OK. L'unica modifica da apportare per utilizzare la versione 2 di Python è di togliere le parentesi a print() che in 2.x è un'istruzione e in 3.x una funzione.

ORIG è adesso una lista (righe 5-10), i componenti sono stringhe. DEST è invece una stringa.

In pratica questo script non è facilmente usabile: i file da copiare sono codificati all'interno dello stesso script, idem la directory di destinazione e resta da vedere cosa capita con nomi più generici.
L'elenco dei file da back-up-pare propongo di memorizzarlo in un file ad hoc, chiamato tag-orig, così:

./orig-1/f-1
./orig-1/f-2-piccolo

~/lab/OKp/lug/Tag-3/orig-2/f1-3
/home/juhan/lab/OKp/lug/Tag-3/orig-2/f1 4

./orig-3/f2-4 manca

Notare che i nomi dei file possono essere relativi alla directory dello script (i primi 2), con l'uso della ~ per indicare la home (il terzo) e assoluti (il quarto). Inoltre ci possono essere righe vuote. Anzi se uno è pasticcione può scrivere commenti: la riga relativa non sarà un file esistente e verrà ignorata.

Ecco lo script per gestirlo:

#!/usr/bin/python3

import os.path, sys

progname = sys.argv[0]
print(sys.argv, progname)
progdir = os.path.dirname(progname)
print(progdir)
fbk = os.path.join(progdir, "tag-orig")
print("file bk =", fbk)
inpf = open(fbk, "r")
ORIG = inpf.readlines()
inpf.close()
print(len(ORIG), ORIG)
print("\n")

for st in ORIG:
    sst = st.strip()
    if len(sst) > 0:
        sst = os.path.expanduser(sst)
        fn = os.path.abspath(
            os.path.join(progdir, sst))
        print(fn)

t12

La path del programma si trova in sys.argv[0], il percorso del file tag-orig viene ricavato usando join() del modulo os.path. di questo modulo utilizziamo anche abspath() ed expanduser(). Quest'ultima si rende necessaria per risolvere ~. Non sono ancora riuscito a provarlo con Windows (G il mio valido aiutante è in vacanza con i nonni e si vede che ha di meglio da fare, beato lui!) ma dovrebbe funzionare (riferirò in futuro).

La directory di destinazione DEST invece dev'essere gestita in modo diverso, secondo me. Propongo due alternative:

  • la directory corrente, quella che con Linux otteniamo con il comando pwd e con Windows con cd;
  • la directory che passiamo allo script come primo argomento; da racchiudere tra apici se contine spazi.

Ritengo che il primo modo sia quello più pratico, pensando a drive (penne) USB, ma chissà...

#!/usr/bin/python3

import os, sys

if len(sys.argv) > 1:
    DEST = os.path.abspath(sys.argv[1])
else:
    DEST = os.getcwd()

print(DEST)

qui

Non resta che inserire questi due pezzi nello script iniziale. Argomento della prossima puntata che se faccio tutto adesso poi di cosa vi racconto? :wink:

Linux perché

gnurantsNon so se vale perché questo post è davvero piccolissimissimo minimo.
Ma mi sembra una cosa che devo dirvi assolutamente, importante, secondo me.

Oggi ho scoperto, su Google plus, un post su una cosa tipica e ostica che viene affrontata in modo originale; per adesso c’è solo la prima parte ma promette bene. L’autore è uno che seguo su Twitter, posta poco ma posta bene, insomma ho perlustrato il blog.

GNUrants è un blog nuovo di pakka, nato il 1° aprile ma non è uno scherzo. Questa è la sua presentazione e questo il post che mi ha indotto a scrivere questo post (lo so che la prof di tagliano mi avrebbe sottolineato e katsiato forte ma ormai non ha più potere su di me).

Sono le cose che ci diciamo un po’ tutti: l’XPocalypse, Monaco di Baviera, iniziative varie in corso (troppe per elencarle), l’amico free man.

Ecco GNUrants io l’ho appena RSSato. Bravi!

Backup solo se… esercizio in bash – 3

n1

Continuo da qui.
Se i file da copiare fossero tutti nella stessa directory lo script sarebbe qualcosa di simile a questo:

#!/bin/bash

function terpri() {
    echo -e copio \"$1\" "in" \"$2\"
}

ORIG=("f-1"
      "f-2-piccolo"
      "f1-3"
      "f1 4"
      "f2-4 manca"
     )

DEST="./dest/"

for (( i=0; i < ${#ORIG[@]}; i++ )); do
    O=${ORIG[${i}]}
    D=$DEST${ORIG[${i}]}
    terpri "$O" "$D"
done

t2

Notare che per adesso i file non vengono copiati, sono ancora in fase di prototipo.
In realtà i file si trovano in cartelle diverse per cui lo script va modificato; la directory di destinazione è invece unica, per comodità.

#!/bin/bash

function terpri() {
    echo -e copio \"$1\" "in" \"$2\"
}

ORIG=("./orig1/f-1"
      "./orig1/f-2-piccolo"
      "./orig2/f1-3"
      "./orig3/f1 4"
      "./orig3/f2-4 manca"
     )

DEST="./dest/"

for (( i=0; i < ${#ORIG[@]}; i++ )); do
    O=${ORIG[${i}]}
    N=$(basename "$O")
    D=$DEST$N
    terpri "$O" "$D"
done

t3

OK, ma OK, avete ragione, si può evitare una riga e una variabile:

#!/bin/bash

function terpri() {
    echo -e copio \"$1\" "in" \"$2\"
}

ORIG=("./orig1/f-1"
      "./orig1/f-2-piccolo"
      "./orig2/f1-3"
      "./orig3/f1 4"
      "./orig3/f2-4 manca"
     )

DEST="./dest/"

for (( i=0; i < ${#ORIG[@]}; i++ )); do
    O=${ORIG[${i}]}
    D=$DEST$(basename "${ORIG[${i}]}")
    terpri "$O" "$D"
done

Ho dovuto proteggere con virgolette il valore in basename() --cosa che si rende necessaria perché ormai dobbiamo rassegnarci agli spazi nei nome dei file ma rende nervoso il mio pupil (peraltro ottimo).

Beh direi che si sono, ecco la versione definitiva:

#!/bin/bash

function copia() {
    S="$1"
    D="$2"
    echo $S
    if [[ -e $S ]] ; then
        NC=$(wc -c "$S")
        ND=${NC%% *}
        if [[ $((ND > 7)) == 1 ]] ; then
            echo $'\t' copio $S in $D
            cp "$S" "$D"
        fi
    fi
}

ORIG=("./orig-1/f-1"
      "./orig-1/f-2-piccolo"
      "./orig-2/f1-3"
      "./orig-3/f1 4"
      "./orig-3/f2-4 manca"
     )

DEST="./dest/"

for (( i=0; i < ${#ORIG[@]}; i++ )); do
    O=${ORIG[${i}]}
    D=$DEST$(basename "${ORIG[${i}]}")
    copia "$O" "$D"
done

tag

Lo script può essere facilmente modificato per funzionare a rovescio, ripristinare i file precedentemente salvati. Troppo facile, lasciato come esercizio.
Un'altra cosa da prevedere (era una delle richieste) è di accodare ai file aggiunte memorizzate temporaneamente in un'altra locazione, p.es. su un drive USB. Cosa semplice, ricorrendo a cat con >> come potete verificate con man cat. E la storia della pipe ormai dovreste conoscerla, ne ho parlato spesso, è una delle cose più belle introdotte da Unix.

Però --sì c'è un però: quando G. (chissà se entrerà nel team degli autori o si farà un blog tutto suo?) ha visto che la programmazione bash non era così immediata e che poi comunque non avrebbe funzionato con Windows mi ha proposto una proposta più che sensata. Cosa che vedremo la prossima puntata. Prossimamente, forse :grin:

Iscriviti

Ricevi al tuo indirizzo email tutti i nuovi post del sito.

Unisciti agli altri 71 follower