Script para ejecutar chown en todas las carpetas y configurar el propietario como el nombre de la carpeta menos el final /

Script para ejecutar chown en todas las carpetas y configurar el propietario como el nombre de la carpeta menos el final /

Algunos tontos corrieron chown -R username. en la carpeta /home de nuestro servidor web pensando que estaba en la carpeta deseada. No hace falta decir que el servidor está arrojando muchos titubeos.

Tenemos más de 200 sitios web y no quiero seleccionarlos todos individualmente, así que estoy intentando crear un script que cambie el propietario de todas las carpetas por el nombre de la carpeta, sin el final /.

Esto es todo lo que tengo hasta ahora, una vez que pueda eliminar / estará bien, pero también me gustaría verificar si el archivo contiene un archivo . en él, y si no es así, ejecute el comando; de lo contrario, pase al siguiente.

#!/bin/bash
for f in *

do

    test=$f;
    #manipluate the test variable
    chown -R $test $f

done

¡Cualquier ayuda sería genial!

¡Gracias de antemano!

Respuesta1

Asumiendo quetodoLas carpetas en el directorio /home/ representan nombres de usuario, puede usar:

for dir in /home/*/; do
    # strip trailing slash
    homedir="${dir%/}"
    # strip all chars up to and including the last slash
    username="${homedir##*/}"

    case $username in
    *.*) continue ;; # skip name with a dot in it
    esac

    chown -R "$username" "$dir"
done

Sugiero ejecutar un ciclo de prueba antes, verificando si el nombre de usuario realmente coincide con un directorio de inicio.

Este comando AWK recupera el directorio de inicio de un usuario determinado.

awk -F: -v user="$username" '{if($1 == user){print $6}}' < /etc/passwd

Comparar este resultado con el directorio de inicio existente es un ejercicio para el lector.

Respuesta2

Puedes usar elnombre basecomando para proporcionar el último componente de una ruta

for dir in /home/*
do
    if [ -d "$dir" ]
    then
        username=$(basename "$dir")
        chown -R "$username" "$dir"
    fi
done

aunque inicialmente lo ejecutaría como

for dir in /home/*
do
    if [ -d "$dir" ]
    then
        username=$(basename "$dir")
        echo "chown -R $username $dir"
    fi
done

para asegurarse de que estaba cuerdo.

información relacionada