Cambiare i permessi a file e directory ricorsivamente

Abbiamo mille file e cento cartelle cui dobbiamo cambiare i permessi? Ecco come farlo senza difficoltà col terminale.

Con l’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’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…) per cui mi sono cercato il modo per farlo da terminale.

I permessi dovevano essere 755 per le directory e 644 per i file. Il comando

chmod 755 -R *

non fa distinzione tra file e directory e cambia indistintamente i permessi a ogni cosa; neanche la sintassi

chmod 644 -R *.txt

ci aiuta perché si ferma solo alla directory dove viene eseguito. Probabilmente con una pipe si potrebbe fare, ma non ho approfondito 1.

Il comando che mi ha aiutato in una frazione di secondo è find (da GUI avrei impiegato qualche ora). Nelle pagine di manuale addirittura è riportato espressamente il comando che serve in questo caso:

find . -type f -exec file '{}' ';'

che nel mio caso diventa

find . -type f -exec chmod 644 '{}' ';'

Vediamo di capire cosa stiamo dicendo al sistema:

trovami (find) in questa directory (.) 2 tutti gli oggetti di tipo file (-type f) quindi esegui il comando (-exec) chmod 644 a ciò che hai trovato ('{}' ';') 3.

Per le directory il comando cambia in questo modo:

find . -type d -exec chmod 755 '{}' ';'

Io rimango sempre meravigliato della potenza del terminale, non so voi…

Note

  1. Magari Shaytan di Linux e dintorni ci saprebbe dire di più
  2. E find va anche nelle sottodirectory.
  3. 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 (MARKDOWN_HASH417e248f80c35ca0d471575a5fb951f5MARKDOWN_HASH). Si potrebbe usare al posto delle virgolette anche il backslash, per cui il comando verrebbe:
    find . -type f -exec chmod 644 \{\} \;
    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:

    • fazen suggerisce:
      find . -type f -print0 | xargs -0 chmod 644
      find . -type d -print0 | xargs -0 chmod 755
    • CDF suggerisce:
      chmod -R a=rw,go=r,+X .

Archiviazione e compressione in Linux

Tutto, o quasi, sull’archiviazione e la compressione in Linux.

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’immediatezza dell’operazione, ma vuole andare a fondo e capire cosa succede quando si fa clic sulla voce di menu Crea archivio…

Anzitutto bisogna distinguere tra archiviazione e compressione. L’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’archivio e dunque assicura una velocità di trasferimento ancora maggiore.

Leggi tutto “Archiviazione e compressione in Linux”

Come sfogliare la cronologia dei comandi da terminale

Stanchi di ripetere lunghe sequenze di comandi da terminale o di ricordarle a memoria o di prelevare delle vostre note sul desktop? Ecco come farvi aiutare facilmente dal potente terminale.

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:

bzr push bzr+ssh://utente@bazaar.launchpad.net/~utente/progetto/branch

possiamo richiamarlo immediatamente digitando solo

bzr push

e premere PagUp: il terminale vi farà scorrere la lista dei comandi che cominciano per bzr push.

Per compiere questa magia, è sufficiente editare il file /etc/inputrc e modificare una riga:

sudo nano /etc/inputrc

Scorrete in basso fino a trovare il seguente blocco (siamo alle righe 40-42):

# alternate mappings for "page up" and "page down" to search the history
#"\e[5~": history-search-backward
#"\e[6~": history-search-forward

Togliete il commento alle righe 41 e 42 (cioè il carattere #) e salvate con CTRL+O e uscite con CTRL+X.

Chiudete il terminale e riapritelo. Provate ora a digitare una sequenza che avete già fatto, ad esempio:

sudo apt

e premete il tasto PagUp. Scorrerete così solo la cronologia che comincia con sudo apt.

A me risulta estremamente utile e fa risparmiare tempo e meningi. :)
Un piccolo video per vedere in atto le operazioni:

Photo courtesy: fallsroad, boot, CC by-nc-nd.

Avviare programmi da terminale

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 “staccare”, diciamo così, il terminale dal programma lanciato, date il comando solito più il simbolo &.

Ad esempio, diamo:

gedit

e il terminale aprirà l’editor di testo. Adesso se chiudiamo il terminale si chiuderà anche l’editor.
Se invece diamo:

gedit &

possiamo usare distintamente il terminale e l’editor di testo che vivranno di vita propria.