web-dev-qa-db-fra.com

Changer récursivement le propriétaire d'un répertoire par son nom

Dans Ubuntu 16.04, j'ai quelques répertoires de sites Web sous /var/www/html/.

Je désire que le propriétaire de chaque répertoire soit identique au nom du répertoire.

Comment pourrais-je changer récursivement le propriétaire d'un répertoire portant le nom de ce répertoire?

Remarques:

1) J'ai déjà créé un utilisateur pour chaque répertoire comme dans:

useradd ${domain} --gecos --disabled-password --disabled-login

2) Cette opération a un objectif de sécurité - éviter que tous les répertoires aient le même propriétaire.

1
Arcticooling

Script de travail

En supposant que www-data constitue le groupe approprié pour votre serveur Web

Entrez ce qui suit avec votre éditeur favori dans chown_www.sh

#!/bin/bash

for directory in `find /var/www/html/ -mindepth 1 -maxdepth 1 -type d`
do

    user=$(basename $directory)
    chown -R $user:www-data $directory
done

le rendre exécutable

chmod +x /path/to/script/chown_www.sh

et exécuter en tant que root ou via Sudo

Sudo /path/to/script/chown_www.sh

Clause de non-responsabilité: il n'y a pas de vérification d'erreur pour voir si les noms de répertoire sont des utilisateurs viables (et/ou des noms propres).


Explication

La find avec une profondeur minimale/maximale de 1 ne trouvera que les répertoires directement situés sous /var/www/html - ce que vous voulez.

-type d s'il y a des fichiers dans /html.

Ensuite, nous obtenons le nom du répertoire avec basename et faisons le chown récursif, comme vous le souhaitiez.


Disclaimer: Ceci est inspiré par l'utilisateur muclux, mais ma modification a été rejetée

4
Robert Riedl

Qu'en est-il de find?

find /var/www/html -mindepth 1 -maxdepth 1 -type d -exec bash -c 'echo chown -R "${0##*/}" "$0"' {} \;

Cela trouvera simplement tous les drépertoire sous /var/www/html/ et non plus en dessous et execute chown -R sur chacun d'entre eux. Dans le shell bash $0 est le chemin du répertoire en cours de traitement et ${0##*/} est le nom du répertoire découpé. J'ai ajouté un echo ci-dessus pour qu'il imprime chaque commande chown à exécuter en premier. Si vous êtes satisfait du résultat, exécutez-le sans le echo.

Si, pour une raison quelconque, vous souhaitez ou avez besoin d’une approche différente pour la tâche, voici quelques alternatives (toutes avec la echo à tester!), La parallel étant la plus efficace en cas de énorme nombre de répertoires:

for i in /var/www/html/*/; do a=${i%/}; echo chown -R "${a##*/}" "$i"; done
for i in /var/www/html/*/; do echo chown -R "$(dirname $i)" "$i"; done
parallel echo chown -R '{=s/\/$//;s/.*\///=}' {} ::: /var/www/html/*/
0
dessert

Je suppose que vous avez N répertoires sous /var/www/html et que vous souhaitez modifier le propriétaire de ces répertoires de niveau supérieur uniquement (de manière récursive), c.-à-d.

/var/www/html/domain1   # -> change owner to "domain1" for this dir and below
/var/www/html/domain2   # -> change owner to "domain2" for this dir and below
/var/www/html/domain3   # -> change owner to "domain3" for this dir and below

Si par exemple /var/www/html/domain1 a des sous-répertoires (comme public, css, data), alors ils devraient non appartenir à un utilisateur public etc. , mais aussi à l'utilisateur domain1.

Compte tenu de cette condition préalable, le scriptlet suivant fonctionnera (en tant qu'utilisateur root):

#!/usr/bin/env bash
cd /var/www/html
GLOBIGNORE=.    # to catch hidden directories
for dir in *; do
    test -d $dir && chown -R $dir $dir;
done
0
PerlDuck

Je ne sais pas si votre plan est bon, mais le script suivant pourrait faire l'affaire (appelé avec Sudo). Veuillez noter que vous ne pouvez utiliser que les ID utilisateur existants en tant que propriétaires.

#!/bin/bash
cd /var/www

for file in `find html/*`
do
    d=`dirname $file`
    p=`basename $d`
    chown $p:www-data $file
done

Le script traite les fichiers et les sous-répertoires de la même manière, aucune récursion n’est donc nécessaire.

nom_base (dirname (fichier)) vous donne le nom du répertoire "parent" immédiat.

0
muclux