Cambiare i permessi ricorsivamente
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.
Esempio $ cd cartella/da/modificare/ $ chmodr g-wx g-w |
Ecco lo script:
#!/bin/bash # # Antonio Ingargiola - 2004 # # chmodr - Un chmod Ricorsivo, che rispetta le differenze file-directory # # Cambia ricorsivamente i permessi di file e directory, ma impostando # permessi diversi per i file e per le directory # # USO # ^^^ # # chmodr # Senza parametri imposta ad un sano default tutti i file (640) e alle # directory (750) contenute nella directory corrente. # # 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 che simbolica. # help () { echo -e "\n Antonio Ingargiola - 2004\n" echo -e " chmodr - Un chmod Ricorsivo, che rispetta le differenze file-directory\n" echo -e " Cambia ricorsivamente i permessi di file e directory, ma impostando" echo -e " permessi diversi per i file e per le directory.\n" echo -e " USO" echo -e " ^^^\n" echo -e " chmodr" echo -e " Senza parametri imposta ad un sano default tutti i file (640) e alle " echo -e " directory (750) contenute nella directory corrente.\n" echo -e " chmodr permessi_file permessi_dir" echo -e " Applica ai file nella directory corrente e sotto-directory i " echo -e " 'permessi_file' e tutte le directory i 'permessi_dir'. La sintassi" echo -e " per i permessi e' la stessa di chmod quindi sia ottale che simbolica.\n" exit 1 } valid_mod () { # Check if the mods are syntactically correct 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' sbagliato. 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.
Autore: ~ The_Noise