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 .

Autore: Aldo Latino

Aldo Latino usa con entusiasmo Linux nella distribuzione Ubuntu, è un appassionato di WordPress e si diletta a fare il blogger. Ha anche una lista dei desideri. Per altre informazioni visita la sua .

11 pensieri riguardo “Cambiare i permessi a file e directory ricorsivamente”

  1. alcuni confondono il terminale unix con il dos ms…pensando che piu o meno siano la stessa cosa (con comandi diversi).

    da quando uso linux (circa un anno continuativo) nonostante non abbia mai approfondito molto, ho certamente capito la straordinaria potenza dei sistemi unix e del terminale; che nulla ha lontanamente a che vedere con il poverissimo e limitato dos.

    1. find . -type f -print0 | xargs -0 chmod 644
      find . -type d -print0 | xargs -0 chmod 755

      L’argomento -print0 di find (e, di conseguenza, -0 di xargs) serve a gestire correttamente i file con caratteri particolari.

  2. Mai complicarsi la vita¹, chmod fà già tutto! :-D

    chmod -R a=rw,go=r,+X .

    Il trucco stà nel “+X” che setta la “x” solo per le directory e non per i file. Purtroppo la versione compatta

    chmod -R rwX .

    NON funziona nel caso che tutto sia già stato impostato a 777 (basta leggere la pagina di manuale per capirlo)

    bye
    CDF

    ¹ beh … dipende dai punti di vista ;-)

      1. Prego, sempre contento di dare un contributo!

        … fra l’altro mi sono accorto di una mia piccola disattenzione: al posto di “a=rw” volevo scrivere “u=rw”. Ma il risultato dovrebbe essere lo stesso!

        Ciao,
        CDF

        1. Sì è lo stesso; e infatti mi pareva strano assegnare quei permessi a tutti. Comunque ha funzionato lo stesso in modo corretto (e non ho ancora capito perché… mi devo leggere il manuale -.-‘).

I commenti sono chiusi