
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.