Cambiare i permessi ricorsivamente
Versioni Compatibili ERRORE: valore non valido ( Tutte le versioni di Debian )! Vedi qui. |
Descrizione
Questo script cambia ricorsivamente i permessi di file e directory, ma impostando permessi diversi per i file e per le directory. In tal modo si possono impostare con un solo comando i permessi di esecuzione di un'intera gerarchia di directory (in modo da potervi accedere) e contemporaneamente togliere il permesso di esecuzione a tutti i file ivi contenuti.
Basta posizionarsi nella cartella interessata e lanciare lo script. Se non viene usato nessun parametro verranno impostati dei sani default (640 per i file e 750 per le cartelle).
Esempio Un utilizzo tipico è quello di sanare i permessi di file copiati da cdrom, da partizioni windows, da chiavette usb formattate fat32 etc. |
I due parametri opzionali sono i permessi rispettivamente di file e cartelle nello stesso formato accettato da chmod. Un terzo parametro opzionale indica una directory di partenza diversa da quella corrente.
Ad esempio:
$ cd cartella/da/modificare/ $ chmodr g-wx g-w
In ultimo, il seguente comando:
$ chmodr -h
mostra una schermata di help.
Script
Lo script:
#!/bin/bash # # chmodr - Un chmod Ricorsivo, che rispetta le differenze file-directory # # Copyright (C) 2004, 2006 - Antonio Ingargiola <debian@fastwebnet.it> # # Released under the GNU GENERAL PUBLIC LICENSE. # help () { cat << EOF chmodr - Un chmod Ricorsivo, che rispetta le differenze file-directory Copyright (C) 2004, 2006 - Antonio Ingargiola <debian@fastwebnet.it> Released under the GNU GENERAL PUBLIC LICENSE. DESCRIZIONE Cambia ricorsivamente i permessi di file e directory, ma impostando permessi diversi per i file e per le directory. Nella ricorsione non segue link simbolici a directory. USO chmodr Senza parametri, partendo dalla directory corrente imposta i permessi 640 (- rw- r-- ---) a tutti i file e 750 (- rwx r-x ---) a tutte le sotto-directory. chmodr permessi_file permessi_dir Applica ai file nella directory corrente e sotto-directory i 'permessi_file' e tutte le directory i 'permessi_dir'. La sintassi per i permessi e' la stessa di chmod quindi sia ottale (es. 640) che simbolica (es. o-rwx). E' possibile specificare un terzo parametro opzionale che indica una directory iniziale diversa da quella corrente. EOF exit 1 } valid_mod () { # Controlla che i permessi siano sintatticamente corretti echo "$1" |\ perl -n -e 'if ($_ =~ /^[01234567]{3}$/) {exit 0}; exit 1' ok_numerical=$? echo "$1" |\ perl -n -e 'if ($_ =~ /^[ugoa]{0,3}[+-=]{1}[rwx]{1,3}$/) {exit 0}; exit 1' ok_symbolical=$? # echo "num $ok_numerical, sym $ok_symbolical" # DEBUG [ "$ok_numerical" = 0 -o "$ok_symbolical" = 0 ] return $? } [[ "$1" = -* ]] && help FILE_MOD="$1" DIR_MOD="$2" BASE_DIR="$3" [ -z "$1" ] && FILE_MOD="640" [ -z "$2" ] && DIR_MOD="750" [ -z "$3" ] && BASE_DIR="./" cd "$BASE_DIR" if !( valid_mod $FILE_MOD && valid_mod $DIR_MOD ); then echo -e "\n ERRORE: Il formato dei permessi e' errato. Per i dettagli" echo -e " vedere la pagina di manuale di chmod.\n" exit 2 fi ls | while read file; do if [ -L "$file" ]; then echo " ==>> '$file' e' un link simbolico, lo ignoro." continue elif [ -d "$file" ]; then echo " Entro nella directory '$file'" chmod u+rwx "$file" 2> /dev/null ||\ { echo " Non ho i permessi per entrare in '$file'"; continue; } cd "$file"; $0 $@; cd - > /dev/null chmod $DIR_MOD "$file" && echo -e " Directory '$file' impostata.\n" elif [ -f "$file" ]; then echo -n " $file ... " chmod $FILE_MOD "$file" && echo " [ OK ]" else echo " Ignoro '$file'." fi done
Il core dell script (quello che esegue effettivamente il cambio dei permessi) è la parte finale, da ls | while read ...
in poi. Tutta la parte precedente serve solo a controllare la correttezza dei parametri passati e a stampare una eventuale schermata di help.
Changelog
- Release iniziale
- Aggiunto un check esplicito per evitare di seguire i link simbolici
- Cambiato header e funzione help()
Autore: ~ The_Noise