Forum Programmation.shell chown récursif avec exclusion de répertoire

Posté par  .
Étiquettes : aucune
0
20
sept.
2007
Salut à tous !

J'aimerais faire un chown -R sur un répertoire en excluant un sous répertoire.

Ex:

[root@WW-NOITST08 miles]# ls -l ./MilesRoot
total 1376
drwxrwxrwx 3 nlaccept nlaccept 12288 sep 19 14:47 batch
drwxrwxrwx 3 nlaccept nlaccept 4096 sep 19 11:39 command
drwxrwxrwx 8 nlaccept nlaccept 4096 sep 4 12:16 milesweb
drwxrwxrwx 3 nlaccept nlaccept 4096 sep 4 12:16 policy
drwxr-xr-x 1 root root 4096 sep 19 14:57 report


--> chown -R --exclude report nlaccept:nlaccept ./MilesRoot

Malheureusement, l'option exclude n'existe pas pour la commande chown.



J'ai donc décidé de passer par un find + grep + xargs

Affichage de l'arborescence: find ./MilesRoot -print --> OK
Affichage de l'arborescence en excluant le dossier voulu: find ./MilesRoot -print | grep -v "report" --> OK

Chown sur le résultat: find ./MilesRoot -print | grep -v "report" | xargs chown nlaccept:nlaccept --> NOK


Cette dernière commande ne marche pas totalement car il me jette sur les fichiers contenant des caractères spéciaux (espaces, -, _, ...).



L'utilisation de -print0 associée à xargs -0 permet de résoudre le problème.

En effet la commande suivante marche correctement avec les fichiers contenant les caractères spéciaux:
find ./MilesRoot -print0 | xargs -0 chown nlaccept:nlaccept


Par contre, j'ai pas réussi à inclure le grep -v dans la chaine:
find ./MilesRoot -print0 | xargs -0 grep -lv "report"
ne fonctionnant pas comme je le voudrais (afficher le nom de tous les fichiers et répertoires sauf le répertoire "report" et ses fichiers)


Résultat, ca marche pas :-)



Une idée ? Sûrement ma syntaxe mais bon ...

Merci d'avance.
  • # Juste find.

    Posté par  . Évalué à 4.

    find ./MilesRoot -not -regex '^./MilesRoot/report.*' -exec chown nlaccept:nlaccept {} \;

    M'enfin bon, si c'est juste pour un seul répertoire et si ce n'est à faire qu'une seule fois, tu as plus vite fait de faire un chmod 000 sur ledit répertoire, lancer ton chown et restaurer les droit du répertoire ensuite.
    • [^] # Re: Juste find.

      Posté par  . Évalué à 1.

      Tout d'abord merci de ta réponse.

      La commande fonctionne bien mais si j'ai une arborescence dans report, l'arborescence subira le chown.

      Résultat, obligé de faire un

      find ./MilesRoot -not -regex '^./MilesRoot/report*.*.*' -exec chown nlaccept:nlaccept {} \;

      Si je veux exclure 3 niveaux hiérarchiques du répertoire report. Et comme je ne peux savoir à l'avance la "profondeur" de ce répertoire, y a t'il moyen de rendre ca dynamique ?

      Merci d'avance
      • [^] # Re: Juste find.

        Posté par  . Évalué à 2.

        Résultat, obligé de faire un

        find ./MilesRoot -not -regex '^./MilesRoot/report*.*.*' -exec chown nlaccept:nlaccept {} \;


        Attention ! C'est une expression régulière, pas une globale shell !

        Je viens d'essayer de mon côté, ça fonctionne très bien. Soit tu as mal écrit l'expression (celle que tu as écrite dans ce commentaire reconnaîtrait « repor », « report », « reporttttttt », tous suivis de n'importe quel motif), soit find est mis en défaut par les problèmes d'encodage des noms de fichiers (entre UTF-8 et ISO-8859-15, par exemple). J'ai le problème sur une Ubuntu Dapper.
        • [^] # Re: Juste find.

          Posté par  . Évalué à 1.

          Je viens de retester et l'expression que tu m'as donnée fonctionne sur le répertoire lui meme mais pas sur son arborescence.

          Tout est en root:

          [root@ww-noitst15 miles]# ls -la
          drwxr-xr-x 4 root root 4096 sep 24 10:02 .
          drwxr-xr-x 4 root root 4096 sep 24 10:02 ..
          -rw-r--r-- 1 root root 191881 sep 24 10:02 jaxen-full.jar
          -rw-r--r-- 1 root root 147698 sep 24 10:02 jdom.jar
          -rwxr-x--- 1 root root 21629 sep 24 10:02 local.properties
          -rw-r--r-- 1 root root 1739 sep 24 10:00 log4j.properties
          drwxr-xr-x 13 root root 4096 sep 24 10:02 MilesRoot
          -rwxr-xr-x 1 root root 1352918 sep 24 10:02 ojdbc14.jar


          Passage de la commande. MilesRoot a changé de propriétaire.


          [root@ww-noitst15 miles]# find ./MilesRoot -not -regex '^./MilesRoot/report*' -exec chown exploit:dba {} \;
          [root@ww-noitst15 miles]# ls -la
          total 5528
          drwxr-xr-x 4 root root 4096 sep 24 10:02 .
          drwxr-xr-x 4 root root 4096 sep 24 10:02 ..
          -rw-r--r-- 1 root root 191881 sep 24 10:02 jaxen-full.jar
          -rw-r--r-- 1 root root 147698 sep 24 10:02 jdom.jar
          -rwxr-x--- 1 root root 21629 sep 24 10:02 local.properties
          -rw-r--r-- 1 root root 1739 sep 24 10:00 log4j.properties
          drwxr-xr-x 13 exploit dba 4096 sep 24 10:02 MilesRoot
          -rwxr-xr-x 1 root root 1352918 sep 24 10:02 ojdbc14.jar



          Le répertoire report n'a pas subit le chown --> normal


          [root@ww-noitst15 miles]# cd MilesRoot/
          [root@ww-noitst15 MilesRoot]# ls -la
          drwxr-xr-x 13 exploit dba 4096 sep 24 10:02 .
          drwxr-xr-x 4 root root 4096 sep 24 10:02 ..
          drwxr-xr-x 5 exploit dba 4096 sep 24 10:00 batch
          drwxr-xr-x 3 exploit dba 4096 sep 24 10:00 command
          drwxr-xr-x 95 exploit dba 16384 sep 24 10:02 connectors
          drwxr-xr-x 7 exploit dba 102400 sep 24 10:00 documents
          drwxr-xr-x 5 exploit dba 4096 sep 24 10:00 milesweb
          drwxr-xr-x 3 exploit dba 4096 sep 24 10:02 policy
          drwxr-x--- 3 root root 4096 sep 24 10:02 report
          drwxr-xr-x 2 exploit dba 4096 sep 24 10:00 schema
          -rwxr-xr-x 1 exploit dba 3990100 sep 24 10:00 userStatistics.csv


          Son contenu a subit le changement.


          [root@ww-noitst15 report]# ls -la
          drwxr-x--- 3 root root 4096 sep 24 10:02 .
          drwxr-xr-x 13 exploit dba 4096 sep 24 10:02 ..
          drwxr-x--- 2 exploit dba 4096 sep 24 10:02 2007_06
          -rwxr-x--- 1 exploit dba 0 sep 24 10:02 test.log



          Je tourne sur une Red Hat ES 4.
        • [^] # Re: Juste find.

          Posté par  . Évalué à 0.

          Je viens de retester et l'expression que tu m'as donnée fonctionne sur le répertoire lui meme mais pas sur son arborescence.

          Tout est en root:

          [root@ww-noitst15 miles]# ls -la
          drwxr-xr-x 4 root root 4096 sep 24 10:02 .
          drwxr-xr-x 4 root root 4096 sep 24 10:02 ..
          -rw-r--r-- 1 root root 191881 sep 24 10:02 jaxen-full.jar
          -rw-r--r-- 1 root root 147698 sep 24 10:02 jdom.jar
          -rwxr-x--- 1 root root 21629 sep 24 10:02 local.properties
          -rw-r--r-- 1 root root 1739 sep 24 10:00 log4j.properties
          drwxr-xr-x 13 root root 4096 sep 24 10:02 MilesRoot
          -rwxr-xr-x 1 root root 1352918 sep 24 10:02 ojdbc14.jar


          Passage de la commande. MilesRoot a changé de propriétaire.


          [root@ww-noitst15 miles]# find ./MilesRoot -not -regex '^./MilesRoot/report*' -exec chown exploit:dba {} \;
          [root@ww-noitst15 miles]# ls -la
          drwxr-xr-x 4 root root 4096 sep 24 10:02 .
          drwxr-xr-x 4 root root 4096 sep 24 10:02 ..
          -rw-r--r-- 1 root root 191881 sep 24 10:02 jaxen-full.jar
          -rw-r--r-- 1 root root 147698 sep 24 10:02 jdom.jar
          -rwxr-x--- 1 root root 21629 sep 24 10:02 local.properties
          -rw-r--r-- 1 root root 1739 sep 24 10:00 log4j.properties
          drwxr-xr-x 13 exploit dba 4096 sep 24 10:02 MilesRoot
          -rwxr-xr-x 1 root root 1352918 sep 24 10:02 ojdbc14.jar


          Le répertoire report n'a pas subit le chown --> normal


          [root@ww-noitst15 miles]# cd MilesRoot/
          [root@ww-noitst15 MilesRoot]# ls -la
          drwxr-xr-x 13 exploit dba 4096 sep 24 10:02 .
          drwxr-xr-x 4 root root 4096 sep 24 10:02 ..
          drwxr-xr-x 5 exploit dba 4096 sep 24 10:00 batch
          drwxr-xr-x 3 exploit dba 4096 sep 24 10:00 command
          drwxr-xr-x 95 exploit dba 16384 sep 24 10:02 connectors
          drwxr-xr-x 7 exploit dba 102400 sep 24 10:00 documents
          drwxr-xr-x 5 exploit dba 4096 sep 24 10:00 milesweb
          drwxr-xr-x 3 exploit dba 4096 sep 24 10:02 policy
          drwxr-x--- 3 root root 4096 sep 24 10:02 report
          drwxr-xr-x 2 exploit dba 4096 sep 24 10:00 schema
          -rwxr-xr-x 1 exploit dba 3990100 sep 24 10:00 userStatistics.csv


          Son contenu a subit le changement.


          [root@ww-noitst15 report]# ls -la
          drwxr-x--- 3 root root 4096 sep 24 10:02 .
          drwxr-xr-x 13 exploit dba 4096 sep 24 10:02 ..
          drwxr-x--- 2 exploit dba 4096 sep 24 10:02 2007_06
          -rwxr-x--- 1 exploit dba 0 sep 24 10:02 test.log



          Je tourne sur une Red Hat ES 4.
  • # Re: chown récursif avec exclusion de répertoire

    Posté par  . Évalué à 1.

    Ce n'est pas une solution générale mais, pour ton cas particulier, il suffit d'exclure le répertoire commençant par 'r':
    chown -R nlaccept:nlaccept MilesRoot/[!r]*
    • [^] # Re: chown récursif avec exclusion de répertoire

      Posté par  . Évalué à 1.

      Merci de ta réponse également.

      La commande ne marche pas correctement car je peux avoir d'autres répertoires dont le nom commence par la lettre "r".

      Mais tu ne pouvais pas le savoir, je ne l'ai pas précisé.

      Merci en tout cas.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.