Cuántas veces tenemos un árbol de directorios y por cualquier cosa debemos aplicarle un chmod diferente a los archivos y a los directorios?
Pues bién, me he encontrado con esta necesidad y he pensado un shell script que recorriera un árbol de directorios dado y aplicara el chmod dependiendo si encuentra un archivo o un directorio. Y ya que estaba metido, lo he adornado aceptando parámetros y haciendo alguna pequeña comprobación antes de que se ponga a trabajar.
A continuación cuelgo el código fuente y lo explico un poco.
Bueno, en primer lugar se comprueba por la existencia de argumentos. Si no hay argumentos, no se puede continuar porque se necesita saber dónde hacer el trabajo… y qué permisos se van a poner!
if [ $# -ne 3 ]; then
echo Bad number of arguments.
echo Usage: $0 ‘path file_permisions dir_permisions’
exit
fi
Luego defino tres variables que vienen a ser los argumentos definidos, pero así el resto del código se entiende mejor
WORK_PATH=$1
FILE_PERM=$2
DIR_PERM=$3
Y seguidamente se hacen unas comprobaciones… Básicamente se comprueba que los permisos que se deben aplicar sean numéricos, mayores que 0 y menores que 777
echo $FILE_PERM | grep [^0-9] > /dev/null 2>&1
if [ “$?” -eq “0″ ]; then
echo Argument File Permision is not a number
echo Must be a 3 digit number like 644 between 0 and 777
exit
fi
if [ “$FILE_PERM” -lt “0″ ]; then
echo Bad File Permision argument
echo Must be a 3 digit number like 644 between 0 and 777
exit
fi
if [ “$FILE_PERM” -gt “777″ ]; then
echo Bad File Permision argument
echo Must be a 3 digit number like 644 between 0 and 777
exit
fi
echo $DIR_PERM | grep [^0-9] > /dev/null 2>&1
if [ “$?” -eq “0″ ]; then
echo Argument Directory Permision is not a number
echo Must be a 3 digit number like 755 between 0 and 777
exit
fi
if [ “$DIR_PERM” -lt “0″ ]; then
echo Bad Directory Permision argument
echo Must be a 3 digit number like 755 between 0 and 777
exit
fi
if [ “$DIR_PERM” -gt “777″ ]; then
echo Bad Directory Permision argument
echo Must be a 3 digit number like 755 between 0 and 777
exit
fi
Y ahora empieza lo bueno. Primero de todo necesito el árbol de directorios. Lo recojo con el ls y le agrego algunos parámetros que me van a simplificar el tema:
- a: Para ver los archivos ocultos
- A: Para que las entradas “.” y “..” no me las dé.
- 1: Para que sólo me devuelva los nombres de los archivos y directorios… ni tamaños ni nada.
- R: Para que sea recursivo
path=”./”
for iteration in `ls -aA1R`
do
Luego necesito recuperar el path, porque si no a la que entre en un segundo nivel de directorios el chmod no va a saber dónde está el archivo. Con el grep recojo sólo las iteraciones que el ls me pone para definirme que ha entrado en un segundo nivel de profundidad. Luego defino que lo que hay son campos separados por dos puntos y que quiero el primero, así me quita los dos puntos de la ruta que el ls printa. Si al final queda algo lo copio a la variable path, quien guardará la info del path dónde se encuentra el puntero. Así, cada vez que se cambie de directorio yo sé dónde está
tmp_path=`echo $iteration | grep ‘\.\/[a-zA-Z\/_0-9\-\s]*’ | cut -d”:” -f1`
if [ “$tmp_path” != “” ]; then
path=”$tmp_path/”
fi
Justo después necesito el nombre del archivo. De hecho, haciendo la inversa del anterior ya me serviría, pero en ése punto he tenido que modificar alguna otra cosa y me ha salido una instrucción más limpia… que podría usar su inversa para recoger el path, pero bueno, de momento lo dejo así. Después compruebo que la acción anterior haya dado algun resultado.
element=`echo $iteration | grep [^\:]$`
if [ “$?” -eq “0″ ]; then
Y ya por último, monto el path entero y compruebo si el resultado es un archivo o un directorio, para aplicarle un chmod con el código de permisos correcto.
final_path=$path$element
if [ -d $final_path ]; then
chmod $DIR_PERM $final_path
else
chmod $FILE_PERM $final_path
fi
Bueno, soy consciente que no es el mejor código del mundo, pero sirve… Si os queréis descargar el archivo completo podéis hacerlo desde aquí: chmodr.sh
Atención: En los códigos aquí escritos hay tres tipos de comillas: simples, dobles y acentos graves sin letra. Wordpress no imprime correctamente éstos carácteres, así que aconsejo la descarga del script para ver claramente qué carácter es el correcto.
Saludos.
Tag:
Escribe un Comentario