Script para executar chown em todas as pastas e definir o proprietário como o nome da pasta menos o final /

Script para executar chown em todas as pastas e definir o proprietário como o nome da pasta menos o final /

Algum entorpecido correu chown -R username. na pasta /home do nosso servidor pensando que ele estava na pasta desejada. Escusado será dizer que o servidor está apresentando muitos problemas.

Temos mais de 200 sites e não quero mostrar todos eles individualmente, então estou tentando fazer um script que mude o proprietário de todas as pastas para o nome da pasta, sem o / final.

Isso é tudo que tenho até agora, assim que puder remover o / tudo ficará bem, mas também gostaria de verificar se o arquivo contém um arquivo . nele e, se não funcionar, execute o comando, caso contrário, vá para o próximo.

#!/bin/bash
for f in *

do

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

done

Qualquer ajuda seria ótimo!

Desde já, obrigado!

Responder1

Assumindo quetodospastas no diretório /home/ representam nomes de usuários, você pode 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

Sugiro executar um loop de teste antes, verificando se o nome de usuário realmente corresponde a um diretório inicial.

Este comando AWK recupera o diretório inicial de um determinado usuário.

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

Comparar esse resultado com o diretório inicial existente é um exercício para o leitor.

Responder2

Você pode usar onome basecomando para fornecer o último componente de um caminho

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

embora eu inicialmente o executasse como

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

para ter certeza de que era sensato.

informação relacionada